【问题标题】:Cant understand what happens when i run this code无法理解当我运行此代码时会发生什么
【发布时间】:2019-10-15 13:25:17
【问题描述】:

我不明白为什么 effe(10) 过程的结果是 110。(这是从练习中提取的代码)

我试图写下代码中发生的事情,但是递归太多,我无法理解发生了什么。

int effe(int);
int gi(int);

int main(){
    int test = effe(10);
    printf("%d\n", test); //this prints 110
    system("pause");
    return 0;
}

int effe(int a){
    if(a < 2)
    return a * 2;
    else
    return (gi(a - 1) + gi(a - 2));
}

int gi(int a){
    if (a < 2)
    return effe(a);
    else
    return (effe(a - 1) + effe(a - 2));
}

【问题讨论】:

  • effe 的调用总数为 133 个,gi 的调用总数为 88 个。如果没有任何 cmets(或好的变量/函数名称),很难说这个程序应该计算什么。
  • 我会在里面扔几个printfs。 printf("In gi, a = %d", a);
  • 我知道,但这不是一个“真正的程序”,它是我学校组织的一种计算机技术竞赛的练习。该练习要求您找到调用 effe(10) 函数后返回的数字。我认为也许有一种简短的方法可以理解它....我不知道....
  • @SteveSummit 很高兴听到这个消息。我也很不擅长这些谜题:当我看到这些东西时,我的大脑就崩溃了

标签: c function recursion


【解决方案1】:

在某种程度上,这是斐波那契的变体。

计算以efff(0)、gi(0)开头的值,依次计算efff(1)、gi(1)、efff(2)、gi(2),直到达到efff(10)、gi( 10)

a    efff(a)    gi(a)
0    0           0
1    2           2
2    2=2+0       2=2+0
3    4=2+2       4=2+2
4    6=2+4       6=2+4
5    10=4+6      10=4+6
6    16=6+10     16=6+10
7    26          26
8    42          42
9    68          68
10   110         110

请注意,每个项目都是斐波那契值的 2 倍 (1,1,2,3,5,8,13,21,34,55)。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2023-02-09
    相关资源
    最近更新 更多