Re: [VB6 ] 利用遞迴產生數列
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):