从“递归结构”到解汉诺塔问题的求解

解决递归问题的关键在于寻找递归的结构
寻找一个可递归问题的递归结构,不仅可以直观地转换为程序语言,进行问题的求解,而且也为我们人脑对问题的求解提供思路,比如3阶的汉诺塔,我们还可简单设计方案,倘若四阶、五阶甚至更高阶,有了对递归的认识,我们便有了求解问题的套路

比如斐波那契数列的递归结构是什么:

f(n)=f(n1)+f(n2)

从数学语言向程序语言:

def fib(n):
    return n if n <= 1 else fib(n-1)+fib(n-2)

整数的幂指数 an

an=a×an1f(n)=a×f(n1)

从数学语言向程序语言:

def power(a, n):
    return a if n == 1 else a*power(a, n-1)

n 阶汉诺塔的递归结构又是什么呢?我们可将 n 阶汉诺塔想象成两部分,上面的 n1 个圆盘(将此 n1 视为 1),和最下的 1 个圆盘,也即:

Hanoi(n)=Hanoi(n1)+Hanoi(1)

我们便将一个 n 阶的汉诺塔问题,变成了类似二阶的问题。

def hanoi(n, fromStack, toStack, spareStack):
    if n == 1:
        print('move disk from', fromStack, 'to', toStack)
    else:
        hanoi(n-1, fromStack, spareStack, toStack)
        hanoi(1, fromStack, toStack, spareStack)
        hanoi(n-1, spareStack, fromStack, toStack)
if __name__ == '__main__':
    hanoi(3, 'a', 'b', 'c')

汉诺塔问题递归求解的时间复杂度分析

t(n)=====1+t(n1)+t(1)+t(n1)3+2t(n1)3+2×3+22×3++2n2×3+2n1t(1)3×(2n11)+2n1×23×(2n11)+2n

时间复杂度为: O(2n) ,指数级(exponential);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值