4. 斐波那契数列的第一个和第二个数分别为1和1,从第三个数开始,每个数等于其前两个数之和(1,1,2,3,5,8,13…………) 
我只想知道程序单步调试的时候是怎么运算的,从第一步开始调试直到结束时的所有步骤,请教牛人!public class TsetArgs {
public static void main(String[] args) {
System.out.print(f(4) + " ");
} public static int f(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return f(n - 1) + f(n - 2);
}
}
}

解决方案 »

  1.   

    f(4)->f(3)+f(2)
          f(3)->f(2)+f(1)
    f(1)=f(2)=1
    f(4)=1+1+1=3
      

  2.   

    我的意思是单步运行的时候,第一次return 1后f(n-1)的值是不是就是1了?然后再计算f(n-2)?
    还是其他的什么意思?
      

  3.   

    f(n-1)的值是1 但是为什么n又变成了3呢?之前的方法n==2是不是不存在了,所以返回了再之前的n值?
      

  4.   

    f(10)
    f(9)+f(8)
    f(8)+f(7)+f(7)+f(6)
    .......
    程序会先展开,然后从低下向上计算
      

  5.   

    我可以给你详细讲一下,来java入门社区
      

  6.   

    楼上这位大哥我用println()调试好几遍了,卡在一个步骤里了,不知道那个步骤表达的是什么意思
      

  7.   


    public class TsetArgs {
        public static void main(String[] args) {
            System.out.print(f(4) + " ");
        }    public static int f(int n) {
            if (n == 1 || n == 2) {
                return 1;
            } else {
                return f(n - 1) + f(n - 2);
            }
        }
    }代码执行过程是f(4)判断4!=1 && 4!=2
    那么就调用f(n - 1) + f(n - 2)
    知道n==2的时候结束
      

  8.   

    第一次  n=4   执行f(4-1)+f(4-2)  既f(3)+f(2)然后 ,f(3)执行 f(3-1)+f(3-2) 和 f(2)执行 return 1
    就这样一直推下去 ,仔细想想 很容易想出来的
      

  9.   

    第一次是f(n-1)后面那个f(n-2)根本就没计算
    是直到f(n-1) return 1的时候才运行的f(n-2)
      

  10.   

    我给LZ详细解释下还好n=4说的清楚;   //第一步运行到f(n - 1) + f(n - 2)先执行f(n - 1)进入f(int n) 方法后面的(+ f(n - 2))还没执行
      //进入以后(4-1)n=3因为(if (n == 1 || n == 2)不成立)继续f(n - 1) 
       //继续f(n - 1): --这时n-1=2return 1,n-2=1 return 1;还有第一步的+ f(n - 2) n-2 = 1return 1
        //return了 三个1加起来(f() + f())=3
      

  11.   

    http://www.nlld.net/program/tiezijiyiqv.do?method=viewtiezi&id=1726
    已经清楚回答了
      

  12.   

    递归的四条基本法则:
    1 基准情形。必须要有某些基准情形,它无须递归就能解出,也就是要有退出递归的条件。 
    2 不断推进。对于那些需要递归求解的情形,每一次递归调用都必须要使求解状况朝接近基准情形的方向推进。 
    3 设计法则。假设所有的递归调用都能运行。 
    4 合成效益。求解一个问题的同一个实例时,切勿在不同的递归调用中做重复性的工作。
    public class TsetArgs {
        public static void main(String[] args) {
            System.out.print(f(4) + " ");
        }    public static int f(int n) {
            if (n == 1 || n == 2) {//基准情形的出现
                return 1;
            } else {
                return f(n - 1) + f(n - 2);//不断向基准情形推进
            }
        }
    }