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) ; }
}
}请问红色的地方是怎么算的
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) ; }
}
}请问红色的地方是怎么算的
我就是觉得他算不到那个foo(i-2)
本题中是
foo(6) = foo(5) + foo(4)
= foo(4) + foo(3) + foo(3) + foo(2)
...................................
没有什么能算不能算的啊
按深度优先展开Foo(i - 1),这条分支上全部扩展完了之后,再按深度优先扩展Foo(i - 2).两个分支都要扩展。
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
第二遍 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)
这个正解。因为是递归调用方法,所以每次只会展开一个。要等到这个return之后才会计算+号右边的,然后这个才会return。所以这个递归方法压栈很严重。数值大的话,就栈溢出了。
你传进来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)]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你没有利用的说