我正在努力理解下面的Fibonacci代码:
private static int mtdFibonacci(int number)
{
if (number == 0) return 0;
if (number == 1) return 1;
return fncRecursive(number - 1) + fncRecursive(number - 2);
}
基本上,我很难创建它作为7的输入函数的函数,等于13.尽管答案是正确的,因为Fibonacci序列的第7个元素是13:
1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10th
1 1 2 3 5 8 13 21 34 55
现在我试图在我自己的论文中复制关于Fibonacci如何递归工作的代码以及c#如何解决它:
if n is 7:
return F(7) = F(7-1) + F(7-2)
return F(7) = F(6) + F(5)
return F(7) = [F(5) + F(4)] + [F(4) + F(3)]
return F(7) = {[F(4) + F(3)] + [F(3) + F(2)]} + {[F(3) + F(2)] + [F(2) + F(1)]}
return 15?
我尝试在线检查,但没有解释斐波纳契序列的正确递归函数如何工作。代码是正确的,输出是正确的,但我无法使用上面的纸张序列复制它。就像7的输入对我来说是15。
答案 0 :(得分:3)
这是我喜欢向初学者解释递归的方法。
让我们设想一个稍微简单的程序的“伪代码”语言版本:
f(n) => if n < 3 then 1 else f(n-1) + f(n-2)
这不是合法的C#,但请仔细阅读并确保您理解这些部分。
现在我们将使用文本玩一个小游戏。游戏规则是:
f(some number)
,则我们将其替换为( the if expression with all the n's changed to some number )
。我们需要在一分钟内制定更多规则,但让我们从那个开始。假设我们有:
f(5)
我们遵守规则。我们用
替换它(if 5 < 3 then 1 else f(5-1) + f(5-2))
下一条规则:
number < number
已替换为true
或false
number - number
被替换为差异number + number
将替换为其总和。(number)
已替换为number
,前提是f
之前没有(
。f 好的,应用这些规则:
(if false then 1 else f(4) + f(3))
最终规则:
if false then X else Y
将替换为Y. if true then X else Y
将替换为X。应用它:
(f(4) + f(3))
现在再次应用第一条规则:
((if 4 < 3 then 1 else f(4-1) + f(4-2)) + (if 3 < 3 then 1 else f(3-1) + f(3-2))
继续适用规则:
((if false then 1 else f(3) + f(2)) + (if false then 1 else f(2) + f(1))
(f(3) + f(2)) + (f(2) + f(1))
我们在这里跳过几步。您看到f(3)
将替换为(f(2) + f(1))
,f(2)
和f(1)
将替换为(1)
,对吧?
(((f(2) + f(1)) + (1)) + ((1) + (1))
(((f(2) + f(1)) + 1) + (1 + 1)
(((f(2) + f(1)) + 1) + (2)
(((f(2) + f(1)) + 1) + 2
再次,跳过几步。如果他们不清楚,那么亲自自己动手
((((1) + (1)) + 1) + 2
(((1 + 1) + 1) + 2
(((2) + 1 ) + 2
((2 + 1)) + 2
((3)) + 2
(3) + 2
3 + 2
5
我们已经完成了。通过一些简单的字符串替换规则,我们推断出f(5)等于5。
你可以将这些简单函数中的函数激活视为简单的“如果我将函数体的所有形式参数替换为它们的参数值会怎么样?”如果你这样想,那么递归变得更加直截了当。
当然,这不是运行时如何真正实现的,这忽略了控制流,变量变异等许多方面。但作为一种在职业生涯早期了解递归的方法,我认为这是一个非常好的方法。
答案 1 :(得分:2)
你只需要仔细扩展你的序列,这就是全部,没有魔法。
F(7) = F(6) + F(5)
= F(5) + F(4) + F(4) + F(3)
= F(4) + F(3) + F(3) + F(2) + F(3) + F(2) + F(2) + F(1)
= F(3) + F(2) + F(2) + F(1) + F(2) + F(1) + F(2) + F(2) + F(1) + F(2) + F(2) + F(1)
= 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
= 13
答案 2 :(得分:-1)
{[F(4) + F(3)] + [F(3) + F(2)]} + {[F(3) + F(2)] + [F(2) + F(1)]}
= 3 + 2 + 2 + 1 + 2 + 1 + 1 + 1 = 13
答案 3 :(得分:-1)