|
香川群子 发表于 2015-3-17 16:44
呵呵,逻辑上正确的递归代码应该是:
If n > 1 Then Fib = Fib(n - 1) + Fib(n - 2) Else If n Then F ...
群子说得很对。群子的代码n=30时,调用次数确实是2692537次。
倒是我对顺序语句及静态变量static的在顺序语句中使用位置没有仔细考虑,笼统地认为只要放在Fibo函数中就OK了。现在看来其实不然。
以下是我的测试代码:- Function Fibo(n%, arr) '香川群子版 斐波那契数 递归计算
- Static a&
-
-
- If n > 1 Then Fibo = Fibo(n - 1, arr) + Fibo(n - 2, arr) Else If n Then Fibo = 1
-
- a = a + 1
- arr(n) = a
-
- End Function
- Sub 测试香川版斐波拉契数递归计算()
- Dim i%, r, c, tim1, tim2, nrec(), nCount(), n%
- Static nStart&
- n = 30
- ReDim nrec(n), nCount(n)
- Rows.Clear
- i = 1
- tim1 = Timer
- Do While i <= 30
- Cells(Int((i - 1) / 10) + 3, (i - 1) Mod 10 + 1) = Fibo(i, nrec)
- nrec(i) = nrec(i) - nStart
- Cells(Int((i - 1) / 10) + 11, (i - 1) Mod 10 + 1) = nrec(i)
- nCount(i) = nrec(i)
- Cells(Int((i - 1) / 10) + 19, (i - 1) Mod 10 + 1) = nCount(i) - nCount(i - 1)
- i = i + 1
- Loop
- tim2 = Timer
- nStart = nStart + nrec(n)
- MsgBox nStart
- Cells(1, 1) = tim2 - tim1
- Range("A2") = "F(1)、F(2)、……、F(30)"
- Range("A10") = "计算F(1)、F(2)、……、F(30)调用递归函数次数总和"
- Range("A18") = "计算F(n)调用递归函数次数"
- End Sub
复制代码 |
|