概念:通过自我调用来解决问题的函数
递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归要注意:
- 递归出口
- 当前问题如何变成子问题
经典案例
阶乘:
求n的阶乘转化为n-1的阶乘
求f(5)不断调用自身直到f(1)出口,计算出结果。
具体代码:
def f(n):
if n == 0 or n == 1:
return 1
else:
return n * f(n - 1)
print(f(5))
汉诺塔问题
剖析问题:
考虑n个盘子的时候,将上面n-1个盘子看做一个整体
1、首先需要将n-1个盘子从A挪到B,通过C,这就变成递归的问题Move(n-1,A,C,B);
2、然后移动:A->C
3、最后将n-1个盘子从B挪到C,通过A,Move(n-1,B,A,C);
具体代码:
def move(n, A, B, C):
if n == 0: #如果没有盘子需要移动,返回
return
move(n-1, A, C, B) #将n-1个盘子移到 B
print("{}->{}".format(A, C)) #将剩下的第n个盘子移到 C
move(n-1, B, A, C) #将在B处的n-1个盘子移到C
move(3,'A','B','C')
蓝桥第760题:数的计算
解题前先找几个示例
比如输入时6,则6 16 26 36 126 136 共有6个数字(自己本身不加任何数也算)
- 那么要找出关键的子问题和子问题与母问题之间的联系,也就是n 和n - 1之间的关系
- 过程讲解:6 前面可以加 1 2 3,如果加了2和3,前面还可以加1,也可以不加,故递归的前提条件:把每个ans都等于1(必须加自身)。
- 子问题与母问题之间的关系为f(n)=f(i)的方案之和,而i<=n//2
- 而递归的出口是n = 1的时候,肯定是1。
思路已清,故破局之法已有,具体代码如下:
import os
import sys
# 请在此输入您的代码
def f(n):
ans = 1
if n == 1:
return 1
for i in range(1,n//2 + 1):
ans += f(i)
return ans
n = int(input())
print(f(n))