行。我知道这是一个经典但我似乎无法找到解释跟踪表如何工作的任何线程。我自己的尝试看起来像错误的逻辑。例如,这段代码效果很好:
Sub Main()
For i = 1 To 6
Console.WriteLine(f(i))
Next
Console.ReadKey()
End Sub
然后我们有功能:
Function f(n)
If n <= 1 Then
Return n
Else
n = f(n - 1) + f(n - 2)
Return n
End If
End Function
然而,我的跟踪表最终如下:
i f-1 f-2 n
1 1
2 1 0 1
3 2 1 3
4 3 2 5
5 4 3 7
6 5 4 9
这对我来说很有意义,但很明显我没有线索。这里有什么错误的逻辑?
答案 0 :(得分:1)
您的跟踪表没有意义,因为f-1
列应该命名为f(n-1)
,目前只显示i-1
。
如果我解决了您所犯的一些错误,我会获得以下代码(以粗体突出显示):
Public Module modmain Function f(n) As Integer If n <= 1 Then Return n Else n = f(n - 1) + f(n - 2) Return n End If End Function Sub Main() For i as Integer = 1 To 6 Console.WriteLine(f(i)) Next Console.ReadKey() End Sub End Module
我获得了前六个Fibonacci元素的正确输出:
$ vbnc fib.vb
Visual Basic.Net Compiler version 0.0.0.5943 (Mono 4.0.1 - tarball)
Copyright (C) 2004-2010 Rolf Bjarne Kvinge. All rights reserved.
A warning message should have been shown: 'Parameter type should be specified.'
Assembly 'fib, Version=0.0, Culture=neutral, PublicKeyToken=null' saved successfully to '/home/kommusoft/testfolder/fib.exe'.
Compilation successful
Compilation took 00:00:00.7312840
$ mono fib.exe
1
1
2
3
5
8
对于跟踪表,您必须重命名列,使其看起来像:
i f(i-1) f(i-2) f(i)
现在,对于前两个i
(i=0
和i=1
),您只需在最后一栏填写0
和1
:
i f(i-1) f(i-2) f(i) 0 0 1 1
现在,对于下一行,可以在已填写的表格部分中查找f(i-1)
和f(i-2)
:
i f(i-1) f(i-2) f(i) 0 0 1 1 2 1 0 1
i f(i-1) f(i-2) f(i) 0 0 1 1 2 0 1 1 3 1 1 2
等