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!}
(m−1)!n!(m−1+n)! +
(
m
+
n
−
1
)
!
m
!
(
n
−
1
)
!
{(m+n-1)!} \over {m!\,(n-1)!}
m!(n−1)!(m+n−1)!
4、实例3—生母牛问题(python3)
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第51年的时候,共有多少头母牛?
年份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
数量 | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 |
推导出为:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
3
)
f(n) = f(n-1)+f(n-3)
f(n)=f(n−1)+f(n−3)
源代码:
运行速度慢如下:
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='')