Re: [VB6 ] 利用遞迴產生數列

看板Visual_Basic作者 (南瓜)時間16年前 (2009/08/15 05:17), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《AA64 (蘇軍最高指揮部)》之銘言: : 這是一個使用遞迴函數的問題 : 小弟想了三,四天了 但是一直寫不出來或是寫錯 : 題目是 X(k+1)= X(k)/2 if X(k)=2n : 3*X(k)+1 if X(k)=2n+1 : 條件:1.須利用遞迴函數(副程式) : 2.當 X(k)=1 或 k>500 時停止 : 3.所建立的數據構成一個陣列 : 初始值X(1)=27 算式中X為一陣列 而k表示第k項 : 寫了很久 不是寫錯就是跑不出來 : 請各位幫幫忙好嗎 : 以下是我的程式碼 : sub rec(k) : dim X(1 to 500) : if k=1 then : X(k)=val(inputbox("輸入X(1)")) : elseif X(k)=1 or k>500 then : exit sub : elseif X(k) mod 2 =0 then : X(k+1)=X(k)/2 : elseif X(k) mod 2 =1 then : X(k+1)=X(k)*3+1 : else : end if : call rec(k+1) : end sub 首先,因為陣列 X 宣告在 Sub 裡面而且又不是 Static, 所以每一層遞迴看到的都是全新的陣列。 解決方法是宣告成 Static 或直接在 Sub 外面宣告它。 假設陣列宣告的問題已經解決了,那麼現在還有另一個問題。 當我們用 rec(1) 開始這個遞迴時, 它設定 X(1) 之後就會直接跑去呼叫 rec(2) 而沒有先計算 X(2) 的值, 於是我們進入 rec(2) 會看到 X(2) 是 0 然後說 X(3) = 0/2。 也就是說,即使 k = 1 我們還是需要讓程式去跑偶數 n/2 奇數 3n+1 那段程式碼。 這兩個問題修好以後應該就會動了。 ---------- 剛才試著用 VB.NET 寫的程式碼,雖然語法應該和 VB6 有差距: Function X(ByVal k As Integer) As Integer Static Dim results(500) As Integer Const base As Integer = 27 If k = 1 Then Return base ElseIf results(k) <> 0 Then Return results(k) Else Dim previous As Integer = X(k - 1) If previous Mod 2 = 0 Then Return previous / 2 Else Return 3 * previous + 1 End If End If End Function Sub Main() For i As Integer = 1 To 500 Console.Write(i) Console.Write(": ") Console.WriteLine(X(i)) If X(i) = 1 Then Exit For End If Next End Sub -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.23.101
文章代碼(AID): #1AXTHy4A (Visual_Basic)
文章代碼(AID): #1AXTHy4A (Visual_Basic)