一、递归算法三定律
- 基本情况
- 改变状态向基本情况靠拢
- 调用本身
二、通过求列表和分析递归算法
代码如下:
def list_sum(num_list):
if len(num_list) == 0:
return 0
elif len(num_list) == 1:
return num_list[0]
else:
return num_list[0] + list_sum(num_list[1:])
分析:
1、基本情况
列表求和的基本情况为列表长度为1,0为异常。
2、改变状态
假设求和列表为[1, 2, 3, 4, 5]可分解为1 + (2+(3+(4+(5)))),使列表长度变小,最后变为基本情况列表长度为1
3、 调用函数本身
最后一行调用函数本身完成递归算法
三、 递归算法应用场景---> 进制转换
10进制转换为其它进制字符串
虽然用Stack可以实现,但作为一个程序员,与生俱来的懒和优雅,递归是我们的不二选择。
Stack实现:
from pythonds.basic import Stack
def base_convert(num, base):
num_str = '0123456789ABCDEF'
num_stack = Stack()
while num > 0:
num_stack.push(num % base)
num = num // base
new_num = ""
while not num_stack.isEmpty():
new_num += num_str[num_stack.pop()]
return new_num
递归方法实现:
def base_convert_recursion(num, base):
str_num = '0123456789ABCDEF'
if num < base:
return str_num[num]
else:
return base_convert_recursion(num // base, base) + str_num[num % base]
四、 递归算法应用--->汉诺塔
汉诺塔,使用递归完成汉诺塔特别简单
思路:
1、n = 1 时直接把a-->c;
2、n > 1时,把n-1移动到b,再把a中的n移动到c;
3、b上的n-1个移动到c
比如n=3,(a-->c, a-->b, c-->b n-1到b), a-->c(最大的移动到c),b-->a, b-->c, a-->c(n-1 的 b-->c)
代码如下:
def hanoi(n, a, b, c):
if n == 1:
print(a + '---->' + c)
else:
hanoi(n-1, a, c, b)
hanoi(1, a, b, c)
hanoi(n-1, b, a, c)
调用:
hanoi(3, 'A', 'B', 'C')
输出:
A---->C
A---->B
C---->B
A---->C
B---->A
B---->C
A---->C