【问题标题】:Computing the number of times fib(n) is called FOR EACH n计算每次调用 fib(n) 的次数 n
【发布时间】:2017-04-30 04:29:58
【问题描述】:

我想计算为每个 n 调用 fib(n) 的次数。我写的代码如下:

#include <stdio.h>
#define N 10

int count[N + 1]; // count[n] keeps track of the number of times each fib(n) is called

int fib(int n) {
    count[n]++;

    if(n <= 1)
        return n;
    else
        return fib(n - 1) + fib(n - 2);
}

int main() {
    for(int i = 0; i <= N; i++) {
        count[i] = 0; // initialize count to 0
    }
    fib(N);

    // print values of count[]
    for(int i = 0; i <= N; i++) {
        printf("count[%d] = %d", i, count[i]);
    }
}

我尝试打印数组 count[] 来获得结果,结果类似于斐波那契数,除了 count[0]:

count[0] = 34 count[1] = 55 count[2] = 34 count[3] = 21 count[4] = 13 计数[5] = 8 计数[6] = 5 计数[7] = 3 计数[8] = 2 计数[9] = 1 计数[10] = 1

有没有办法在数学上显示这个结果,也许是一个递归公式?另外,为什么 count[0] 或者 fib(0) 不继续斐波那契数列?谢谢。

【问题讨论】:

  • 您已经进行了“优化”,其中fib(1) 不会调用fib(0) 来获取结果 - 它直接返回1。只有fib(2) 会调用它。因此,fib(0) 没有像应有的那样频繁调用。另外,我不明白你的第一个问题

标签: c++ c recursion fibonacci


【解决方案1】:

因为count[1] 将被每个count[2] + count[3] 调用,但count[0] 只会被count[2] 调用...count[1] 没有贡献,因为它是一个终点。

至于数学公式:

if n == 0: fib(N - 1)
else: fib(N-(n-1))

【讨论】:

    【解决方案2】:

    至于计算

    call(n)=call(n-1)+call(n-2)+1
      call(1)=1
      call(0)=1
    

    希望这能让事情变得清晰。

    n  | calls
    ---+--------
    0  |   1
    1  |   1
    2  |   3 
    3  |   5  f(3)= f(2)[= f(1)+ f(0)]+ f(1)
    5  |   9  
    .
    fib(n)    2*fib(n)-1
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 2019-07-08
      • 2010-11-18
      • 2011-06-05
      • 2023-03-16
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      相关资源
      最近更新 更多