大自然 发表于 2013-7-22 17:54:46

各位,请帮我看下,这段程序输出的结果是多少

#include<stdio.h>

int foo(int n){
        int i;

        if(n<3)
                return 1;
        for(i=0;i<n;i++){
               
        printf("%d\n",foo(n-1)+foo(n-2));       
        returnfoo(n-1)+foo(n-2);
        }

}
int main(){


printf("foo;%d\n",foo(4));


   return 0;

}

albert_w 发表于 2013-7-22 19:23:07

2
3
2
foo;3


http://codepad.org/ooNKYPCv 没看lz是什么程序...

大自然 发表于 2013-7-23 10:35:50

albert_w 发表于 2013-7-22 19:23 static/image/common/back.gif
2
3
2


请问下,在for循环时候,循环几次,怎么会出来三个数字,就是在这想不明白

albert_w 发表于 2013-7-23 12:07:52

foo 4的时候
printf("%d\n",foo(n-1)+foo(n-2));
打印前call 了foo 3,这里的foo(n-1)触发一次打印, 也就是2, 然后这行打印出3, 然后下面return这一行, 再次call到foo(n-1),再打印一个2出来.

大自然 发表于 2013-7-23 18:44:24

albert_w 发表于 2013-7-23 12:07 static/image/common/back.gif
foo 4的时候
printf("%d\n",foo(n-1)+foo(n-2));
打印前call 了foo 3,这里的foo(n-1)触发一次打印, 也就 ...

如果我输入为5时候,printf("%d\n",foo(n-1)+foo(n-2));中的foo(n-1)和foo(n-2),他们怎么调用,是同时调用,还是一个一个的调用

albert_w 发表于 2013-7-23 18:55:18

大自然 发表于 2013-7-23 18:44 static/image/common/back.gif
如果我输入为5时候,printf("%d\n",foo(n-1)+foo(n-2));中的foo(n-1)和foo(n-2),他们怎么调用,是同 ...

肯定一个一个调用, 至于先左还是先右, 这个就不好说了, 和编译器实现有关系,也就是入栈顺序

大自然 发表于 2013-7-24 10:37:14

albert_w 发表于 2013-7-23 18:55 static/image/common/back.gif
肯定一个一个调用, 至于先左还是先右, 这个就不好说了, 和编译器实现有关系,也就是入栈顺序 ...

将数据换为5的话,返回的结果为232252322,按照推理的话我在这怎么推理,都是2325232 。少了最后一个2 。大侠,帮助分析下呗,感激

albert_w 发表于 2013-7-24 10:56:58

#include<stdio.h>

int foo(int n){
      int i;

      if(n<3) {
                printf("foo(%d):1\n", n);
                return 1;
      }
      for(i=0;i<n;i++){
            printf("foo(%d):%d\n",n, foo(n-1)+foo(n-2));      
            returnfoo(n-1)+foo(n-2);
      }
}
int main(){
    printf("===%d===\n",foo(5));
    return 0;
}

不解释, run这段程序, 得这个结果
foo(2):1
foo(1):1
foo(3):2
foo(2):1
foo(1):1
foo(2):1
foo(4):3
foo(2):1
foo(1):1
foo(3):2
foo(2):1
foo(1):1
foo(2):1
foo(2):1
foo(1):1
foo(3):2
foo(2):1
foo(1):1
foo(5):5
foo(2):1
foo(1):1
foo(3):2
foo(2):1
foo(1):1
foo(2):1
foo(4):3
foo(2):1
foo(1):1
foo(3):2
foo(2):1
foo(1):1
foo(2):1
foo(2):1
foo(1):1
foo(3):2
foo(2):1
foo(1):1
===5===

掐掉foo(1) 和foo(2)就是你要的了

232是f(4)的打印, f5=f4+f3,那么f3还有一次打印也就是那个2的来源. 不能说f4包含了f3,就吃掉f4+f3加号后的f3

albert_w 发表于 2013-7-24 11:04:34

程序写的很乱, for 语句return了.
递归完了再递归.
别杀脑细胞了, 把程序写成这样多好:
      if(n<3) {
                printf("foo(%d):1\n", n);
                return 1;
      }
      else {
                i= foo(n-1) + foo(n-2);
                printf("foo(%d):%d\n", n, i);
                return i;
      }

ljbskx 发表于 2013-9-13 17:33:29

c语言的递归调用啊,本来就非常难以理解啊,建议想先看看c语言关于 递归的调用
页: [1]
查看完整版本: 各位,请帮我看下,这段程序输出的结果是多少