python算法三:递归法

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))
    

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值