求高手帮我解释下下面这个递归的执行过程:
class factorial{
int fact(int n){ //这个方法 是怎么执行的
int result;
if(n==1)return 1;
result=fact(n-1)*n;//方法调用方法自己
return result;
}
}
class digui{
public static void main(String args[]){
factorial f=new factorial();
System.out.println(f.fact(3));
}
}
------解决方案--------------------说白了就是
n=3
result=fact(n-1)*n=fact(2)*3 = fact(1)*2*3 = 1 * 2 * 3,因为fact(1) = 1
------解决方案--------------------e.g. fact(3)
s1: fact(3) = fact(3-1) * 3;
s2: fact(3-1) = fact((3-1)-1) * (3-1);
so fact(3) = (fact(3-1-1) * (3-1)) * 3;
(3-1-1)==1 true;
so fact(3-1-1) = 1;
so fact(3) = (1 * (3-1)) * 3 = 3!
------解决方案--------------------是算输入的n的阶乘吧 简单说就是机器会在内存里存放int fact(int n){}这个方法的多个副本 n不断减1并且调用自己 直到n=1 然后return 1; 返回到上一个int fact(int n){}中这时result=fact(n-1)*n;这句就变成了result=1*2; (因为之前fact(n-1)返回的是1 而在本次int fact(int n){}里n为2) 然后接着 return result; 也就是 return 2; 再次返回上一个int fact(int n){}同理这时result=fact(n-1)*n;这句就变成了result=2*3; 最后调用结束返回主函数打印出6
也就是说在这个程序里int fact(int n){}这个方法被调用了3次
用生活里的一个例子打个比方 有3个人排成1排 第1个人要吃饭 所以他问第2个人 “现在可以吃饭么?” 第2个人要做饭 所以他问第3个人 “菜买了么?”(把这3个人看成int fact(int n){}这个方法的3个副本 这就是前面说到的不断调用自己) 第3个人回答第2个人 “菜买了!”(好了 现在开始不断返回了) 第2个人听到后就会通过第3个人返回的结果得出结论“我可以做饭了” 然后又告诉回第一个人 “菜买了,我马上做饭” 第1个人听到后就会通过第2个人返回的结果得出结论 “我马上就可以吃饭了” 所以归根结底的问题是 “到底有没有买菜!?” if(n==1)这句其实就相当于 “到底有没有买菜!?” 他就是问题的根源 也就是说只要没满足if(n==1)这个条件就继续调用自己(相当于上面的不断问下一个人) 当满足if(n==1)这个条件时(相当于知道“菜买了!”) 就开始不断的计算和返回到上一次调用自己的int fact(int n){}里(告诉问自己的人)
应该能看明白吧 如果这都看不明白那我真没办法了
一切来源于生活~ ^_^