2 u011562926 u011562926 于 2013.11.05 12:10 提问

java递归原理求高人解惑

int i=1;
int Test(int n){
System.out.println("*****************"+(i++));
int result =0;
if(n==1)
return 1;
result = Test(n-1)*n;
System.out.println(result+" "+n);
return result;
}
我进行调试,比如n=8,只打印第一条语句,打了八次,当n=1时返回结果1,跳出方法,然后继续执行,此时n变为2,为何?再然后只执行第二条打印语句的内容,为何?直到n变为8。求解啊...

1个回答

shimucheng
shimucheng   2013.11.05 12:51
已采纳

递归方法虽然是方法调用方法本身,但是每次调用的时候变量是不共享的
你可以这样理解 以8为例
System.out.println("*****************"+(i++));
int result =0;
if(n==1)
return 1;
result = Test(n-1)*n;
这段代码执行的时候第一层(n=8)调用了第二层(n=7),第二层调用了第三层(n=6),以此类推
到达第八层之后n=1,return后不再继续调用,此时由第八层(n=1)返回至第七层(n=2)来执行
System.out.println(result+" "+n);
return result;
第七层将n=2执行完毕后回到第六层n=3再次执行这段代码,最后回到第一层n=8

u011562926
u011562926 谢谢,已经用了很多递归了,按照你讲的那么理解,是挺爽的,等以后基础深厚点再返回来看看。
4 年多之前 回复
shimucheng
shimucheng 1.因为在这一行你再次调用了这个方法,递归调用主要就是调用方法本身和跳出条件 2.每一层方法中虽然都有n和result,实际上他们并不是同一个对象,每一层方法拥有自己的n和result,并不共享,在Test(n=1)和return result的时候做值传递而不是地址传递。或者你这样理解这个问题,虚拟机在对方法分配内存地址的时候就标记了每一个n是哪一层方法的
4 年多之前 回复
u011562926
u011562926 经过你这样说,我可以理解,但是不理解为什么会这么做,比如:1.为什么会是以result=Test(n-1)*n为分界线,它的机制是什么?2.当n=1时有返回值,但n继续递增时,它怎么确定返回值的?
4 年多之前 回复
shimucheng
shimucheng 以result=Test(n-1)*n;这句作为分界线,执行到这句之前第七层(n=2)是由第六层传进来的,执行这句时第七层调用第八层,传递参数n=1;等待第八层处理结束之后赋值给result。此时第七层并没有结束,是处于等待状态。第八层中接收n=1,返回1,将这个1赋值给第七层中的result,第七层继续执行后面的语句。第七层执行完之后把result传给第六层,在第六层再次执行,直至回到第一层执行完毕
4 年多之前 回复
shimucheng
shimucheng 打印之前的语句在往里走的时候执行过了
4 年多之前 回复
u011562926
u011562926 我想了解得深入点,据上所说,当到达第八层之后,n=1,return,第八层返回第七层(n=2)执行,为何会不执行第二条打印语句前的内容呢?还有,result的赋值过程是怎么样的?
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Kaggle搭积木式刷分大法: LB 0.11666(排名前15%)
專 欄 ❈本文作者:王勇,目前感兴趣项目商业分析、Python、机器学习、Kaggle。17年项目管理,通信业干了11年项目经理管合同交付,制造业干了6年项目管理:PMO,变革,生产转移,清算和资产处理。MBA, PMI-PBA, PMP。❈ 我参加了两个Kaggle 比赛,一个是Titanic (分类),另一个是HousePrice(回归)。分别获得了前7% (花了约3个月业
java递归实现最大公约数和最小公倍数
第一个最大公约数使用的2300年前被发明的欧几里得算法求得,大致原理为: 如果有两个非负整数p、q,若q==0,则最大公约数为p;否则,p和q的最大公约数就是p除以q所得的余数和q的最大公约数。 第二个最小公倍数更简单 公式:最小公倍数=两整数的乘积÷最大公约数 关键代码如下: //最大公约数(Greatest Common Divisor) publ
计算机语言递归原理及行列式递归求值
计算机语言递归原理及行列式递归求值  杨忆鸿    2015.11.11           如果要彻底明白递归执行原理,就必须有一个循序渐进的过程,从基本开始才能了解,栈很简单,属于数据结构的概念,如果对栈一点都不了解,就必须先了解什么是栈单元、栈顶变量、入栈、出栈。 1.子程序执行的过程:        调用子程序的程序称为调用者,调用者先将调用参数值压入栈中,再将返
java 递归求和
求1-100的和,和c语言还是很相似的 import java.io.*; import java.util.Scanner; public class Main { public static void main(String [] args){ System.out.println(leijia(1)); } public static int leijia(int x){
[算法]Java实现 求两个非负整数最大公约数 循环法 递归法
[算法]Java实现 求两个非负整数最大公约数 循环法 递归法代码功能:1.Java实现(完整源码附测试用例); 2.求解两个非负整数p,q(p>=q)的最大公约数; 3.循环法 以及 递归法两种求解思路;完整源码:/* GCD:Greateast Common Divisor */ public class GCD{ public static void main(String arg
java的递归实现原理
打印5的阶乘 5! 1.普通方法实现 package cn.itcast.digui; public class DiGuiDemo { public static void main(String[] args) { int temp=1;//初始值是1 for(int i=2;i<=5;i++){ temp*=i;//每遍历一次就乘以 } System.out.p
java解惑 书籍类 谜题
java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑
java 递归与非递归求n的阶乘
public class Factorial {//求阶乘类 /** * @param args * 非递归求n的阶乘函数norecursion */ static int norecursion(int n) { int sum = 1; for(int i=1;i sum *= i; } return sum; }//norecursion /** * @param
二叉树的深度(递归和非递归)---java实现
递归实现 为了求树的深度,可以先求其左子树的深度和右子树的深度,可以用递归实现,递归的出口就是节点为空。返回值为0; 非递归实现 利用层次遍历的算法,设置变量level记录当前节点所在的层数,设置变量last指向当前层的最后一个节点,当处理完当前层的最后一个节点,让level指向+1操作。设置变量cur记录当前层已经访问的节点的个数,当cur等于last时,表示该层访问结束。 层次遍历在求
递归算法-求最大公约数-java实现
/** * 递归算法:求最大公约数,根据欧几里德知道-》m和n(m > n)的最大公约数 = n 和m%n的最大公约数 * * @author timmy1 * */public class GreatestCommonDivisor { public int getGCD(int m, int n) { if (n == 0) { return m; } else { return