VB递归和Fibonacci序列

时间:2016-06-23 21:22:08

标签: vb.net recursion

行。我知道这是一个经典但我似乎无法找到解释跟踪表如何工作的任何线程。我自己的尝试看起来像错误的逻辑。例如,这段代码效果很好:

 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

这对我来说很有意义,但很明显我没有线索。这里有什么错误的逻辑?

1 个答案:

答案 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)

现在,对于前两个ii=0i=1),您只需在最后一栏填写01

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