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);
}
}
}
我只想知道程序单步调试的时候是怎么运算的,从第一步开始调试直到结束时的所有步骤,请教牛人!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);
}
}
}
解决方案 »
- Callable多线程问题,求高手解答!谢谢。
- 关于java中char的问题
- JAVA 语言做APP程序的界面,用哪个集成开发环境比较多?
- 我对String的一些见解(看了JAVA面试题解惑系列(二)——到底创建了几个String对象?之后)
- java源代码编辑器关键字颜色显示实现原理?
- 关于java的学习方向我有一个不明请高手指点.....
- 哪位朋友请看看我的理解对不对,关于为什么finally语句里最好不能有return?疑惑中。。
- 如何獲得當前運行.class文件的路徑
- 请教如何在weblogic6上deploy一个包含Applet的Web Applcation(.war)/谢谢/
- 求教异常
- 有高手帮忙改一下这个JAVA程序中的错误吗?
- 如何禁止JTable的复制粘贴
f(3)->f(2)+f(1)
f(1)=f(2)=1
f(4)=1+1+1=3
还是其他的什么意思?
f(9)+f(8)
f(8)+f(7)+f(7)+f(6)
.......
程序会先展开,然后从低下向上计算
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的时候结束
就这样一直推下去 ,仔细想想 很容易想出来的
是直到f(n-1) return 1的时候才运行的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
已经清楚回答了
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);//不断向基准情形推进
}
}
}