博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

递归算法

Posted on 2010-11-01 16:05  桃子在路上  阅读(463)  评论(0)    收藏  举报

递归:程序调用自身的编程方法称为递归。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁。

递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归故事:“从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说,从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说……。”

例子:递归求解阶乘

 
 1 //递归求阶层
 2 program duigui01;
 3 var num,fact:longint;
 4
 5 function func(n:integer):longint;
 6 begin
 7   if n=1 then func:=1    //递归边界
 8   else
 9     func:=n*func(n-1);   //递归调用
10 end;
11
12 begin
13   readln(num);
14   fact:=func(num);
15   writeln(fact);
16 end

 

 递归转化为递推:
  这种数据的定义形式按递归定义,也可以转化为递推的方式去实现。

 1 //递推求阶乘
 2 program jiecheng;
 3 var num,n,i:longint;
 4 begin
 5   read(n);
 6   num:=1;
 7   for i:=1 to n do
 8     num:=num*i;
 9   writeln(num);
10 end.