Fibonacci调用堆栈中叶子与总节点的比率

时间:2011-07-27 16:34:37

标签: algorithm math fibonacci

如果你要看一个计算第n个Fibonacci数的递归实现(根100,子99和98,孙子98,97,97和96等等),大概是什么比例叶子数与递归树中节点总数的对比?

    100
   /   \
  98   97
 /  \   .
96  97  .
.    .  .
.    .  

不是家庭作业,只是在学术上对此感到好奇。 (是的,我意识到递归实现是计算斐波纳契数的一种可怕的方法)

3 个答案:

答案 0 :(得分:6)

离开的数量只是F(n),因为F(i)只是该节点下方的离开数量。你明白为什么吗? (提示:使用归纳法)

非叶​​节点的数量是叶节点的数量-1。这是二叉树的属性。所以节点的总数是F(n) + F(n)-1 = 2F(n)-1

当n变大时,该比率接近 1/2

答案 1 :(得分:5)

fib(x)由叶纤维(x-1)和纤维叶(x-2)组成。所以你得到了与斐波纳契数相同的递归方程。

如果终止点(叶子)是Fib1和Fib0,那么

tree   numofleaves
fib2   2
fib3   3
fib4   5
fib5   8
fib6   13
...

和numofleaves(x)= fib(x + 1)。

对于节点数,可以得到方程numnodes(x)= 1 + numnodes(x-1)+ numnodes(x-2)。

答案 2 :(得分:0)

我实际上通过归纳计算了一个证据,证明Fibonacci树中的叶子数量总是超过内部节点的数量。

证明:设E(n)为输入n的斐波那契树的叶子数,        并且M(n)是输入n

的斐波那契树的内部节点的数量
   E(n) >= M(n) + 1

基本情况:

f(0):E(0)= 1,M(0)= 0

f(1):E(1)= 1,M(1)= 1

f(2):E(2)= 2,M(2)= 1

f(3):E(3)= 3,M(3)= 2

大小为n的树的叶子等于叶子 每个子树:

E(n)= E(n-1)+ E(n-2)

大小为n的树的内部节点等于每个节点的内部节点 子树,加上根

M(n)= M(n-1)+ M(n-2)+ 1

E(n)> = [M(n - 1)+ 1] + [M(n - 2)+ 1],(通过归纳假设)

因此,E(n)= M(n-1)+ M(n-2)+ 2

所以,E(n)> = M(n)+ 1, QED