1.定义:递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数或过程来表示问题的解。一个过程或函数直接或间接调用自己本身,这种过程或函数叫递归过程或函数。
2.过程:
(1)定义一个递归函数
(2)找出递推关系
(3)明确边界条件
例题1:年龄问题
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
分析过程:
1.定义一个年龄函数age(n),该函数的功能是求出第n个人的年龄
2.根据题意已知age(5)=age(4)+2,age(4)=age(3)+2,age(3)=age(2)+2,
age(2)=age(1)+2,因此可知递推关系表达式为:age(n)=age(n-1)+2
3.age(1)不可以继续向前递推,因此age(1)的值为本题的边界。即当n=1时,age(1)=10
因此,本题中的年龄函数按如下定义:
age(n)=1 n==1
= age(n-1)+2 n>1
代码如下:
def age(n):
if n==1:
return 10
else:
return age(n-1)+2
print(age(5))
例题2:斐波那契数列
在数学与计算机领域中,递归函数是指用函数自身来定义该函数的方法。如著名的斐波那契数列“1, 1, 2,3, 5,8, 13, ..”,可以递归定义为
利用递归法编写斐波那契函数,从键盘上输入20,求斐波那契第20项的值。
代码如下:
def fibo(n):
if n==1:
return 1
if n==2:
return 1
if n>2:
return fibo(n-1)+fibo(n-2)
#主程序
n=int(input())
print(fibo(n))
例题3:用递归法求1+2+3+…+100的值
分析:
1.定义递归函数mysum(n),功能是求出1+2+...+n的和
2.递推关系表达式:mysum(n)=mysum(n-1)+n
3.边界条件:当n==1时,mysum(n)=1
代码如下:
def mysum(n):
if n==1:
return 1
else:
return mysum(n-1)+n
#主程序
s=mysum(100)
print(s)
例题4:用递归法求1!+2!+...8!+9!+10!的值
分析:
1.定义递归函数jc(n),功能是求出n的阶乘
2.递推关系表达式:jc(n)=jc(n-1)*n
3.边界条件:当n==1时,jc(n)==1
代码如下:
def jc(n):
if n==1:
return 1
else:
return jc(n-1)*n
#主程序
s=0
for i in range(1,11):
s=s+jc(i)
print(s)
例题5:花果山上有一洞,小猴每次采取跳1阶或者跳3阶的办法从山下跳跃上台阶进洞,编程输入台阶数,输出有多少种不同的跳法。
分析:
1.定义递归函数s(n),功能是求出跳上s级台阶的方法数。
2.递推关系表达式:s(n)=s(n-1)+s(n-3)
3.边界条件:
当n==1时,s(n)==1
当n==2时,s(n)==1
当n==3时,s(n)==2
代码如下:
def s(n):
if n==1 or n==2:
return 1
elif n==3:
return 2
else:
return s(n-1)+s(n-3)
#主程序
n=int(input())
print(s(n))
例题6:平面上有n条直线,其中任意两条直线不平行,任意三条直线不共点,问这n条直线把平面划分成为多少个部分?
代码如下:
def s(n):
if n==1:
return 2
else:
return s(n-1)+n
n=int(input()) #输入n条直线
print(s(n) )
例题7:利用递归法,求两个数的最大公约数
def gcd(a,b): #递归法求最大公约数
r=a%b #求余数
if r==0:
return b #余数为零返回最大公约数
else:
return gcd(b,r)
m=int(input("m="))
n=int(input('n='))
print(m,n,"的最大公约数为",gcd(m,n))