递归

1、递归是什么?

递归,在数学与计算机科学中,是指函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。
通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。
优点:实现简单,可读性好。
缺点:效率较低,容易溢出,重复计算。

2、实例1—李白打酒(python3)

话说大诗人李白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
源代码:

count = 0
order =[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

def fun(num,flower,store,wine):
    global count
    '''
    :param num:次数
    :param flower: 花
    :param store: 商店
    :param wine: 酒
    :return: None
    '''
    if(wine<0 or store>5 or flower>10):
        return None
    # 最后两次肯定遇到花
    elif num==13 and store==5 and wine ==2:
        count += 1
        print(order)
    # 先遇花,先遇店结果都是一样,顺序相反
    elif num<13:
        # 遇到花
        order[num] = 'b'
        fun(num+1,flower+1,store,wine-1)
        # 遇到店
        order[num] = 'a'
        fun(num+1,flower,store+1,wine*2)

order[14] = 'b'
order[13] = 'b'
fun(0,0,0,2)
print(count)

运行结果:
在这里插入图片描述

3、实例2—组合排列问题(python3)

计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是《组合数学》的研究领域。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。

int f(int m, int n)
{
	if(m==0 || n==0) return 1;
	return  f(m-1,n)+f(m,n-1);
}

可以证明:
( m + n ) ! m !   n ! {(m+n)!} \over {m!\,n!} m!n!(m+n)! = ( m − 1 + n ) ! ( m − 1 ) !   n ! {(m-1+n)!} \over {(m-1)!\,n!} (m1)!n!(m1+n)! + ( m + n − 1 ) ! m !   ( n − 1 ) ! {(m+n-1)!} \over {m!\,(n-1)!} m!(n1)!(m+n1)!

4、实例3—生母牛问题(python3)

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第51年的时候,共有多少头母牛?

年份12345678
数量1234691319

推导出为: f ( n ) = f ( n − 1 ) + f ( n − 3 ) f(n) = f(n-1)+f(n-3) f(n)=f(n1)+f(n3)
源代码:
运行速度慢如下:

def fun(n):
    '''
    :param n:表示第n年
    :return: 返回母牛的数量
    '''
    if n ==1:
        return 1
    elif n== 2:
        return 2
    elif n==3:
        return 3
    elif n==4:
        return 4
    else:
        return fun(n-1)+fun(n-3)
print(fun(51),end='')

运行速度快如下:

cow = [1,2,3,4]
for i in range(4,51):
    cow1= cow[i-1] +cow [i-3]
    cow.append(cow1)
    print(cow[i]);
print(cow[50],end='')

5、实例4—取字母问题(python3)

A B C D中取5次,每个字母都可以重复取出,形成一个串。现在要求,串中A出现的次数必须为偶数(0次也算偶数)。求可以形成多少种可能的串。

#取第n次时,A出现奇数
def fun1(n):
    if n==1:
        return 1
    return 3*fun1(n-1) +fun2(n-1)
#取第n次时,A出现偶数
def fun2(n):
    if n==1:
        return 3;
    return 3*fun2(n-1) + fun1(n-1)
print(fun2(5),end='')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值