当前位置:编程学习 > JAVA >>

跪求大牛 递归调用初学的 小伟谢谢你们了

递归是一种特殊的调用形式,是方法自己调用自己。
例如:
   现在假设完成一组数字的累加操作,除了可以使用循环的方式完成,
   也可以通过递归的方式完成。
   
    public class limin
{
public static void main(String args[])
{
System.out.print("计算结果:"+sum(100));  //调用操作
}
public static int sum(int num)  //定义方法用于求和操作
{
if(num==1)                  //判断是非是加到了最后一个数
{
return 1;
}else
{
return num+sum(num-1);//递归调用
}
}
}


 我能知道她是自己调用自己 可是没办法知道 其中的原理 希望大牛们 能给我解释一下
小弟长期 挂在这里等答案的,希望大牛们不要嫌弃麻烦,小弟在这里跪谢大家了 java --------------------编程问答-------------------- 简单给LZ举例,到6累加的递归:

这个图的意思就是,每当程序读到getSum()时,只要不满足条件,程序就会跳转到另一个运算体中,就这样,知道满足条件,才一次性释放出来。




递归其实多用在文件操作上,这个也比较实用

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。

递归要注意:
1,限定条件。

2,要注意递归的次数。尽量避免内存溢出。


--------------------编程问答-------------------- 额,学习了, --------------------编程问答--------------------
引用 1 楼 Candylibin 的回复:
简单给LZ举例,到6累加的递归:

这个图的意思就是,每当程序读到getSum()时,只要不满足条件,程序就会跳转到另一个运算体中,就这样,知道满足条件,才一次性释放出来。




递归其实多用在文件操作上,这个也比较实用

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,还可以再次调用本功能。
也就是……




纠正一下,是3的递归

递归是倒着往回返的,,最后就相当于,1+2+3=6,,正好是6的 --------------------编程问答-------------------- 递归存放结果的可以是一个局部变量 也可以是全局变量,
局部变量的话 会在返回上一层调用时局部变量消亡
比如Candylibin的例子中的getsum(int n),n=1,i就是局部变量,返回上一层调用时i已消亡 而上一层的getsum(1)会产生一个临时变量3,再往上返回,每层n都不一样 是一个新的变量
就是你也可以这样写:
public static int n=1;
public static void getSum(int n){
  if(n==1)return;
  getSum(n-1);
}
这是全局变量 但多了个static int ,如果不是整型,是个Arraylist的话,jvm就不会回收静态的,消耗内存。
--------------------编程问答-------------------- 这个可以用一种数据结构来分析,那就是栈,不知道楼主是否知道栈数据结构的特点,就是后进先出,先进后出的,Last In First Out(LIFO),First In Last Out(FILO),只允许在栈的一端进行操作的,在函数递归调用的时候,比如说你要计算的数是5,那么在调用的过程中,每一次首先会判断if(num == 1){return 1},如果不满足,则会执行代码 return num + sum(num - 1),此时的num就是5会被存入栈中,位于栈底,在调用sum(4),同理,4,3,2会一次入栈,完了1满足if(num == 1)条件,最后一个元素1就被放入栈顶,此时没有函数调用了,就是递归调用终止,然后,被存进去的元素依次出栈,进行加法预算。楼主可以用一个栈的结构图演示一下。希望对楼主有帮助。 --------------------编程问答-------------------- 举个例子吧
当num = 3时
执行方法如下:
sum(3) -> 3 + sum(2) -> 3 + 2 + sum(1) 到这里开始返回,注意只有sum(1) = 1
   6   <- 3 + 3       <- 3 + 2 + 1 (从后向前看)
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,