public class MainClass {
public static void main(String[] args) {
System.out.println("\n最后结果="+Foo(6));
}
static int count=1;
public static int Foo(int i) {
System.out.print("i="+i+"  ");
if (i <= 0){
return 0;
}else if (i > 0 && i <= 2){
return 1;
}else{
return Foo(i - 1)+Foo(i - 2) ; }
}
}请问红色的地方是怎么算的

解决方案 »

  1.   

    先算Foo(i-1),再算Foo(i-2),然后相加,就这么简单啊。
      

  2.   

    先是开始Foo(i-1)这个知道,就是在他算了之后后面的foo(i-2)又是怎么算的,
    我就是觉得他算不到那个foo(i-2)
      

  3.   

    既然能算 foo(i - 1) 为什么就不能算 foo(i - 2)
    本题中是 
    foo(6) = foo(5) + foo(4)
           = foo(4) + foo(3) + foo(3) + foo(2)
           ...................................
    没有什么能算不能算的啊
      

  4.   

    为什么会执行不到呢。不要被i迷惑了,i只是个参数,每次执行方法,i的值是变了,但是却存在不同的地方。所以不可能执行不到的。
      

  5.   

    Foo(i - 1)+Foo(i - 2)
    按深度优先展开Foo(i - 1),这条分支上全部扩展完了之后,再按深度优先扩展Foo(i - 2).两个分支都要扩展。
      

  6.   


    public class MainClass {
    public static void main(String[] args) {
    System.out.println("\n最后结果="+Foo(6));
    }
    static int count=1;
    public static int Foo(int i) {
    System.out.print("i="+i+" ");
    if (i <= 0){
    return 0;
    }else if (i > 0 && i <= 2){
    return 1;
    }else{
    return Foo(i - 1)+Foo(i - 2) ; }
    }
    }很好算的丫。 你传进来6 ,
    第一遍 return Foo(5)+Foo(4)
    第二遍 return Foo(4)+Foo(3)+Foo(3)+Foo(2)
    第三遍 return Foo(3)+Foo(2)+Foo(2)+Foo(1)+Foo(2)+Foo(1)+1
    第四遍 return Foo(2)+Foo(1)+1+1+1+1+1+1
    第五遍 return 1+1+1+1+1+1+1+1=8
      

  7.   

    第一遍 return Foo(5)+Foo(4)
    第二遍 return Foo(4)+Foo(3)+Foo(4) 
    第三遍 return Foo(3)+Foo(2)+Foo(3)+Foo(4) 
    第四遍 return Foo(2)+Foo(1)+Foo(2)+Foo(3)+Foo(4)
    第五遍 return Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)+Foo(4)
    第六遍 return Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)+Foo(3)+Foo(2)
    第七遍 return Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)+Foo(2)+Foo(1)+Foo(2)
      

  8.   


    这个正解。因为是递归调用方法,所以每次只会展开一个。要等到这个return之后才会计算+号右边的,然后这个才会return。所以这个递归方法压栈很严重。数值大的话,就栈溢出了。
      

  9.   

    基于10楼修改一下:
    你传进来6 
    下划线表示没有不是下一个要调用的方法,表示在栈中等待ing。
    删除线表示已经有返回值,不用再递归。
    中括号内为返回值的和。为确定的一个计算结果。
    第一遍 return Foo(5)+Foo(4)
    第二遍 return Foo(4)+Foo(3)+Foo(4)
    第三遍 return Foo(3)+Foo(2)+Foo(3)+Foo(4)  
    第四遍 return [Foo(2)+Foo(1)]+Foo(2)+Foo(3)+Foo(4)
    ------ return [Foo(2)+Foo(1)]+Foo(2)+Foo(3)+Foo(4)
    ------ return [Foo(2)+Foo(1)+Foo(2)]+Foo(3)+Foo(4)
    第五遍 return [Foo(2)+Foo(1)+Foo(2)]+Foo(2)+Foo(1)+Foo(4)
    ------ return [Foo(2)+Foo(1)+Foo(2)+Foo(2)]+Foo(1)+Foo(4)
    ------ return [Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)]+Foo(4)
    第六遍 return [Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)]+Foo(3)+Foo(2)
    第七遍 return [Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)]+Foo(2)+Foo(1)+Foo(2)
    ------ return [Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)+Foo(2)]+Foo(1)+Foo(2)
    ------ return [Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)+Foo(2)+Foo(1)]+Foo(2)
    ------ return [Foo(2)+Foo(1)+Foo(2)+Foo(2)+Foo(1)+Foo(2)+Foo(1)+Foo(2)]
      

  10.   

    用Eclipse Debug之,你就会很清楚地看到他的调用过程。
      

  11.   

    public class MainClass {
    static int count=1;

    public static void main(String[] args) {
    System.out.println("\n最后结果="+Foo(6));
    }

    public static int Foo(int i) {
    System.out.print("第"+count+"层"+"---------");
    System.out.print("i="+i+" "+"\n");
    count++;
    if (i <= 0){
    return 0;
    }
    else if (i > 0 && i <= 2){
    return 1;
    }
    else{
    return Foo(i - 1)+Foo(i - 2) ; 
    }
    }
    }关于Foo(i-1)+Foo(i-2)从左自右先解析Foo(i-1)再解析Foo(i-2);解析的FOO(i-1)如果再可以分成Foo(i-1)+Foo(i-2)的话继续前述的解析顺序。
    LZ 定义的那个count你没有利用的说