作者salagadoola (南瓜)
看板Visual_Basic
标题Re: [VB6 ] 利用递回产生数列
时间Sat Aug 15 05:17:47 2009
※ 引述《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