1、概述
递归是解决问题的一种方法,其主要思想在于,将问题分为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。
递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。
其特点有:
- 自身调用自身
- 必须有终止条件
需要注意的是:
- 递归的效率比较低,如果有时间限制不建议使用
- 递归过程中需要有一个明确的结束条件,即递归出口
2、案例
(1)数列求和
def listSum(numlist):
return numlist[0] if len(numlist) == 1 else numlist[0] + listSum(numlist[1:])
if __name__ == '__main__':
print(listSum([1, 2, 3, 4, 5]))
(2)汉诺塔问题
"""
问题描述:
汉诺塔是一种古老的游戏。
一共3个柱子,标号为1,2,3。
1号柱子有从大到小一共n个盘子。
每次移动最上方的一个盘子,可以移动到其他的柱子。
任何一个盘子,都不能叠在比它更小的盘子的上方。
请把盘子从1号柱子,全部移动到3号柱子。
解题思路:
1、利用递归
2
"""
i = 1
def hanoi(n, a, b, c):
"""
n:盘子数量
a:柱子1
b:柱子2
c:柱子3
"""
global i
if n > 0:
hanoi(n - 1, a, c, b)
print('第{}步:把{}号盘子,从{}号柱子移动到{}号柱子'.format(i, n, a, c))
i += 1
hanoi(n - 1, b, a, c)
if __name__ == '__main__':
hanoi(3, "A", "B", "C")
(3)阶乘问题
def factorial(num):
return 1 if num == 1 else num * factorial(num - 1)
if __name__ == '__main__':
print(factorial(5))
(4)斐波那契数列
def fibonacci(num):
if num == 1 or num == 2:
return 1
else:
return fibonacci(num - 1) + fibonacci(num - 2)
if __name__ == '__main__':
print(fibonacci(4))
(5)杨辉三界
def yanghui(num):
if num == 1:
return [1]
row = yanghui(num - 1)
print(row)
return [1] + [row[i] + row[i + 1] for i in range(len(row) - 1)] + [1]
if __name__ == '__main__':
print(yanghui(6))