2010年1月21日 星期四

2010/01/22 費氏數

由"in.txt"讀取一數字n求出第n個費氏數,費氏數定義如下:
           0,當n=0時
f(n)=   1,當n=1時
            f(n-1)+f(n-2),當n>=2時
在此列舉一串數列:0、1、1、2、3、5、8、13、21、34、55、89、144、233,這些就是由0<=n<=13所組成的費氏數。
※(0<=n<=1000)

輸入範例:8

輸出範例:21

出自 程式設計試題匯集 p.43 費氏數

16 則留言:

  1. Private Sub Form_Load()
    Dim a(1000)

    Open App.Path & "\in.txt" For Input As #1
    Input #1, n
    Close #1

    Open App.Path & "\out.txt" For Output As #2
    a(1) = 1
    a(2) = 1
    For i = 2 To n
    b = Val(a(i - 2))
    c = Val(a(i - 1))
    ans = b + c
    a(i) = ans
    Next i

    Print #2, ans
    Close #2
    End Sub

    回覆刪除
  2. Private Sub Form_Load()
    Dim a(30) As Integer
    Open App.Path & "\in.txt" For Input As #1
    Input #1, x
    Close #1
    Open App.Path & "\out.txt" For Output As #1
    a(0) = 0
    a(1) = 1
    For i = 2 To x
    a(i) = a(i - 1) + a(i - 2)
    Next i
    Print #1, a(x)
    Close #1
    End Sub

    回覆刪除
  3. 皓好,
    原來是我太久沒寫程式了嗎?
    這是我很喜歡的一個題目說,
    費氏函數。
    用陣列來寫的確很快,但是你中間特別又用了val函數是為什麼呢?
    又是多遶了一圈的意思嗎?
    費氏函數除了用陣列之外還有兩個方式,
    1,如果限制不能用陣列的話,要如何解?
    2,不知道你們學過「遞迴」了嗎?這個費氏函數用「遞迴」程式來寫,很經典的。
    明兒個我飛去北海道,兩個星期後回來,所以這期間的程式,如果在北海道有網路,我也會上來看,如果沒網路,就再說啦,反正發文的日期是看得到的,只是還沒批改而已。要堅持哦。

    回覆刪除
  4. Dim a(1000) As Long
    Private Sub Form_Load()
    Open App.Path & "/in.txt" For Input As #1
    Input #1, n
    Open App.Path & "/out.txt" For Output As #2
    a(0) = 0
    a(1) = 1
    For i = 2 To n
    a(i) = a(i - 1) + a(i - 2)
    Next i
    Print #2, a(n)
    Close #2
    Close #1
    End Sub

    回覆刪除
  5. Private Sub Form_Load()

    Open App.Path & "\in.txt" For Input As #1
    Input #1, x
    Close #1

    Open App.Path & "\out.txt" For Output As #2

    a = 0
    b = 1

    If x = 0 Then
    Print #2, a
    ElseIf x = 1 Then
    Print #2, b
    Else
    For i = 2 To x
    c = a + b
    a = b
    b = c
    Next i
    Print #2, c
    End If


    Close #2
    End Sub

    回覆刪除
  6. 阿瑋、高仔、Y揚、皓好,
    我喜歡用阿瑋的程式,有費氏函數的精神,(我自己說的啦)。
    還有,回頭又看了皓的程式,當輸入是0,1時,會出錯。(也就是說開端的值,沒注意到。
    你們有用1000陣列的,有用30陣列的,超過30項呢? 超過integer呢?超過long呢?
    反而是什麼都不說的,會是內定的double,可以做到最大的數值。

    回覆刪除
  7. 那我應該是多打的。
    修正<>

    遞迴喔。
    好像還沒有學過。
    我想看看怎麼寫。
    因為好像沒有聽說過類似的

    恩,老師你好好去玩~
    我們會想念你的!! 禮物(2pt的大小...)
    好啦。
    祝你玩得愉快!!!!

    回覆刪除
  8. 對阿!
    不知道老師可不可以貼一些有關『遞回』的程式碼=ˇ=

    回覆刪除
  9. 恩,我有修正過了。
    開端沒有設定到。
    那輸入0,1就會有問題

    回覆刪除
  10. 直接空寫一下遞迴版的程式,你們再試試修改一下。
    form_load()
    open app.path & "\in.txt" for input as #1
    open app.path & "out.txt" for output as #2
    input #1,n
    print #2, myf(n)
    close #1
    close #2
    end sub

    function myf(x as integer) as double
    select case x
    case 0
    myf=0
    case 1,2
    myf=1
    case else
    myf=myf(x-1)+myf(x-2)
    end select
    end function

    '後面這個自定函數,它的函數名字叫做myf,傳回值的時候,就用名字當成變數,來傳回值。
    '而這個函數中,又呼叫自己函數來求值,這個自己呼叫自己的動作,就叫做「遞迴」。

    回覆刪除
  11. 原來這個就是遞迴阿
    今天寫計概考卷有看到呢 >"<

    多翻了幾次題本,發現還有很多的題型
    數學能力不夠.無法理解題義.之類的
    偏偏又是比賽題型
    雖說現在就談到那個有點太遠了
    但是否能先挑些題目設個標籤存放
    並請老師給點提示
    然後我們再試著去解題
    當然,這是額外的題型
    不強迫也不算在"功課"內

    並想問是否有推荐的流程圖製作軟體
    若有空閒的時間製作流程圖
    不僅印象更深刻也較容易理解

    寒假比較空閑,找點事做:P
    老師就請放心的滑吧 XD

    回覆刪除
  12. 高仔好,
    當然可以,先打一些題目當研究是很好的,本來這該我來做的事,由你主動提出更好。
    想一些數學題,是我很喜歡的事。
    甚至是一些由數學上不容易做的事,反而可以用程式的方式,"暴力"做出來呢。

    流程圖的部分,以前似乎有用過類似viso之類名稱的軟體,學校裡是現在的設備組長張組長教的,可以去問張組長(前科主任)。
    如果是我用的話,簡單的word,就可以用了。不過,流程圖這玩意兒,畫得出來的,原本就會懂了,不懂的,也很難畫出來的。
    先找些你想玩玩的數學題吧。
    然後在回應中可以留下各人的想法,我看到了,也會說說我的方式的。(現在還不確定北海道住的那兒有沒有網路,我會帶我的蘋果去就是了)

    回覆刪除
  13. Dim B(100) As Integer
    Private Sub Form_Load()
    Open App.Path & "/in.txt" For Input As #1
    Open App.Path & "/out.txt" For Output As #2
    Input #1, X
    Max = 0
    n = X
    Select Case n
    Case 0
    ans = 0
    Case 1
    ans = 1
    Case Is > 1
    B(0) = 0
    B(1) = 1
    For i = 2 To n
    B(i) = B(i - 1) + B(i - 2)
    Max = B(i)
    Next i
    ans = Max
    End Select
    Print #2, ans
    Close #2
    Close #1
    End Sub

    回覆刪除
  14. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Input #1, n
    Close #1
    a = 1: b = 0
    For i = 1 To n - 1
    ans = a + b: b = a: a = ans
    Next
    Open App.Path & "\out.txt" For Output As #2
    Print #2, ans
    Close #2
    End Sub

    進度追趕中 =D 今天比較有空來做這個

    回覆刪除
  15. Public Sub Form_Load()
    Me.Hide
    Open App.Path & "/in.txt" For Input As #1
    Open App.Path & "/out.txt" For Output As #2
    Input #1, x
    a = 0: b = 1
    For i = 1 To x
    q = a + b
    a = b: b = q
    Next i
    Print #2, a
    Close #2
    Close #1
    End
    End Sub

    2分

    回覆刪除
  16. 剛剛試了試,怎麼好像不能留言了,小小可惜的遙遠的日子。留言,表示來過。

    回覆刪除