黑马程序员技术交流社区

标题: 递归算法我看好多还是不清楚谁帮举个的简单例子 [打印本页]

作者: 杨占伟    时间: 2012-11-29 10:24
标题: 递归算法我看好多还是不清楚谁帮举个的简单例子
本帖最后由 杨占伟 于 2012-11-29 16:03 编辑

递归算法我看了好多代码还是不清楚,谁帮举个简单的例子,并详细说明一下.
作者: 崔维友    时间: 2012-11-29 12:58
本帖最后由 崔维友 于 2012-11-30 12:42 编辑

最简单的递归
  1. class Digui {
  2.         public static void main(String[] args)
  3.         {
  4.                 System.out.println("Hello World!");
  5.                 //调用自身
  6.                 main(args);
  7.         }
  8. }
复制代码
如果没有终止条件,会导致堆内存溢出:


作者: 黑马_郑亮新    时间: 2012-11-29 13:18
class diGui2
{

static int count=0;   
public static void main(String[] args) {      
        Add(1);     
System.out.print(count);   
}  

public static void Add(int num)     {     
                if(num<=100)      
                {  count+=num;      
                Add(num+1);      //简单的说就是自己调用自己
                }  
        }
}
作者: 许王斌    时间: 2012-11-29 13:56
//计算数组{1,1,2,3,5,8.......} 第30位值

static void Main(string[] args)   
{   Console.WriteLine(Process1(30));  Console.ReadLine();  }   

public static int Process1(int i)   
{   //计算数组{1,1,2,3,5,8.......} 第30位值  
if (i == 0) return 0;  
if (i == 1) return 1;  
else
return Process1(i - 1) + Process1(i - 2);
}

我个人认为递归算是一种变相的循环,只不过它没有明显的循环语句和终止条件。
它是一种函数执行到某一步时又再次调用本函数继续执行,在调用执行时又会调用执行本函数,如此往返,直到不满足条件时跳出,一层层的跳出。最后出来的时候返回的是最里层的执行结果。
  
作者: 黑马-张扬    时间: 2012-11-29 15:49
  1. namespace test
  2. {
  3.     class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             Console.WriteLine(func(10));         
  8.             Console.ReadKey();
  9.         }
  10.         public static int func(int n)
  11.         {
  12.             if (n == 1)
  13.                 return 1;   //递归的出口条件
  14.             else
  15.                 return func(n - 1) + 1;//调用自身并且降低问题规模同时也会增加栈的开销(因为要保存“现场”)
  16.         }
  17.     }
  18. }
复制代码
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数来表示问题的解。
递归算法解决问题的特点:
  (1) 递归就是在过程或函数里调用自身。   
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。   
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

作者: 杨占伟    时间: 2012-11-29 16:03
谢谢大家的回复.
作者: 马毅    时间: 2012-11-30 10:46
崔维友 发表于 2012-11-29 12:58
最简单的递归如果没有终止条件,会导致对内存溢出:

简洁,清楚~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2