递归算法是一种用若干步可重复的简单运算(规律)来描述复杂问题的方法。
递归概念:
当过程或函数的定义中,其内部操作又直接或间接地出现对自身程序的引用,则称这样的程序嵌套定
义为递归定义。
递归算法是把处理问题的方法定义成与原问题处理方法相同的过程,在处理问题的过程中又调用自身
定义的函数或过程。
例如,在数学上,所有偶数的集合可递归地定义为:
①0是一个偶数;
②一个偶数和2的和是一个偶数。
可见,仅需两句话就能定义一个由无穷多个元素组成的集合。在程序中,递归是通过函数或过程的
调用来实现的。函数或过程直接调用其自身,称为直接递归;函数或过程间接调用其自身,称为间接递归。
递归程序的执行过程及程序设计:
(1)递归程序的执行过程
递归程序在执行过程中,一般具有如下模式:
①将调用程序的返回地址、相应的调用前变量保存在栈中;
②执行被调用的程序或函数;
③若满足退出递归的条件,则退出递归,并从栈顶上弹回返回地址、返回变量的值,继续沿着返回地址,
向下执行程序;
④否则继续递归调用,只是递归调用的参数发生变化:增加一个量或减少一个量,重复执行直到递归调
用结束。
(2)递归程序设计
能够用递归算法解决的问题,一般满足如下要求:
①需要求解的问题可以化为子问题求解,其子问题的求解方法与原问题相同,只是数量的增加或减少;
②递归调用的次数是有限的;必须有递归结束的条件
递归算法的简单应用:
[例1] 植树节那天,有五位参加了植树活动,他们完成植树的棵数都不相同。问第一位同学植了多少
棵时,他指着旁边的第二位同学说比他多植了两棵;追问第二位同学,他又说比第三位同学多植了两棵;…
如此,都说比另一位同学多植两棵。最后问到第五位同学时,他说自己植了10 棵。到底第一位同学植了
多少棵树?
分析:设第一位同学植树的棵数为a1,欲求a1,需从第五位同学植树的棵数a5入手,根据“多两棵”
这个规律,按照一定顺序逐步进行推算:
①a5=10;
②a4=a5+2=12;
③a3=a4+2=14;
④a2=a3+2=16;
⑤a1=a2+2=18;
Pascal程序:
Program Exam1;
Var i, a: byte;
begin
a:=10; {以第五位同学的棵数为递推的起始值}
for i :=1 to 4 do {还有4人,递推计算4次}
a:= a+2; {递推运算规律}
writeln(’The Num is’, a);
readln
end.
递推算法以初始{起点}值为基础,用相同的运算规律,逐次重复运算,直至运算结束。这种从“起点”
重复相同的方法直至到达一定“边界”,犹如单向运动,用循环可以实现。递推的本质是按规律逐次推出
(计算)下一步的结果。
[例2]斐波列契数列(Faibonacci)0,1,1,2,3,5,8,13,21,34……求此数列第n项。
即:F1=0 (N=1)
F2=1 (N=2)
Fn=Fn-1 + Fn-2 (N>=3)
Pascal程序:
var f0,f1,f2:real;
i,n:byte;
begin
readln(n);
f0:=0;f1:=1;
for i:=2 to n-1 do
begin
f2:=f0+f1;
f0:=f1; f1:=f2
end;
writeln(f2:1:0)
end.
递归概念:
当过程或函数的定义中,其内部操作又直接或间接地出现对自身程序的引用,则称这样的程序嵌套定
义为递归定义。
递归算法是把处理问题的方法定义成与原问题处理方法相同的过程,在处理问题的过程中又调用自身
定义的函数或过程。
例如,在数学上,所有偶数的集合可递归地定义为:
①0是一个偶数;
②一个偶数和2的和是一个偶数。
可见,仅需两句话就能定义一个由无穷多个元素组成的集合。在程序中,递归是通过函数或过程的
调用来实现的。函数或过程直接调用其自身,称为直接递归;函数或过程间接调用其自身,称为间接递归。
递归程序的执行过程及程序设计:
(1)递归程序的执行过程
递归程序在执行过程中,一般具有如下模式:
①将调用程序的返回地址、相应的调用前变量保存在栈中;
②执行被调用的程序或函数;
③若满足退出递归的条件,则退出递归,并从栈顶上弹回返回地址、返回变量的值,继续沿着返回地址,
向下执行程序;
④否则继续递归调用,只是递归调用的参数发生变化:增加一个量或减少一个量,重复执行直到递归调
用结束。
(2)递归程序设计
能够用递归算法解决的问题,一般满足如下要求:
①需要求解的问题可以化为子问题求解,其子问题的求解方法与原问题相同,只是数量的增加或减少;
②递归调用的次数是有限的;必须有递归结束的条件
递归算法的简单应用:
[例1] 植树节那天,有五位参加了植树活动,他们完成植树的棵数都不相同。问第一位同学植了多少
棵时,他指着旁边的第二位同学说比他多植了两棵;追问第二位同学,他又说比第三位同学多植了两棵;…
如此,都说比另一位同学多植两棵。最后问到第五位同学时,他说自己植了10 棵。到底第一位同学植了
多少棵树?
分析:设第一位同学植树的棵数为a1,欲求a1,需从第五位同学植树的棵数a5入手,根据“多两棵”
这个规律,按照一定顺序逐步进行推算:
①a5=10;
②a4=a5+2=12;
③a3=a4+2=14;
④a2=a3+2=16;
⑤a1=a2+2=18;
Pascal程序:
Program Exam1;
Var i, a: byte;
begin
a:=10; {以第五位同学的棵数为递推的起始值}
for i :=1 to 4 do {还有4人,递推计算4次}
a:= a+2; {递推运算规律}
writeln(’The Num is’, a);
readln
end.
递推算法以初始{起点}值为基础,用相同的运算规律,逐次重复运算,直至运算结束。这种从“起点”
重复相同的方法直至到达一定“边界”,犹如单向运动,用循环可以实现。递推的本质是按规律逐次推出
(计算)下一步的结果。
[例2]斐波列契数列(Faibonacci)0,1,1,2,3,5,8,13,21,34……求此数列第n项。
即:F1=0 (N=1)
F2=1 (N=2)
Fn=Fn-1 + Fn-2 (N>=3)
Pascal程序:
var f0,f1,f2:real;
i,n:byte;
begin
readln(n);
f0:=0;f1:=1;
for i:=2 to n-1 do
begin
f2:=f0+f1;
f0:=f1; f1:=f2
end;
writeln(f2:1:0)
end.