python 递归算法

一、递归算法三定律

  • 基本情况
  • 改变状态向基本情况靠拢
  • 调用本身

二、通过求列表和分析递归算法

代码如下:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值