Fibonacci递归如何在C#中工作?

时间:2017-05-14 13:43:11

标签: c# recursion fibonacci

我正在努力理解下面的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。

4 个答案:

答案 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已替换为truefalse
  • 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)

我正在阅读你的问题是上述算法背后的逻辑。我坚信的一件事是“一个尺寸不适合所有人”,这是一个很好的例子。

计算第n个Fibonacci数的快速解决方案是递归地添加数字,直到第n个循环结束。相反,上述算法试图以相反的顺序推导出第n个斐波纳契数。

enter image description here

这里的目标是找到第n个斐波那契数,根据定义,它必须是前两个数的总和,而这两个数又是前两个数的总和。

按照这个定义你可以从我创建的图中看到x必须是y = x - 1和z = x - 2的总和,等等。