关于递归的单步调试问题


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);
}
}
}

20 个解决方案

#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


如果讲解啊?

#7


引用 4 楼 neohope 的回复:
f(10) 
f(9)+f(8) 
f(8)+f(7)+f(7)+f(6) 
....... 
程序会先展开,然后从低下向上计算

是这样啊
LZ想知道怎么样的细节?

#8


我想知道n值每一步变化的原因,以及最后如何得出的结果

#9


你别怕麻烦,自己模拟一下调用步骤,自己弄明白了就彻底明白了

#10


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

#11


哎,夜深了,无人回答问题了

#12



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的时候结束

#13


递归是个压栈出栈的过程。。。

#14


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

#15


debug一下不就知道了?

#16


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

#17


我给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

#18


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

#19


递归的四条基本法则:
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);//不断向基准情形推进
        }
    }
}

#20


太感谢各位了,结贴了~!
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告