递归算法补充

#10的阶乘(递归应用)
def fact(n):
    print("factorial has been called with n=" + str(n))
    if n==1:
        return 1
    else:
        res = n * fact(n - 1)
        print("intermediate result for",n,"*fact(",n-1,"):",res)
        return res
print(fact(10))

分治算法:其实上次写的快速排序算法就是用到了分而治之的思想,也属于递归思想的应用。所谓分而治之就是对问题不断进行分割,直到找到最小单元的问题的解法,让后再扩散到整个问题的求解过程,达到各个击破的效果。
举个例子,要将一个168×64的矩形均匀地分成方块,且分出的方块要尽可能大。这个要怎么实现呢?
一般是从最小的边开始探索,
在这里插入图片描述
然后开始思考被割剩下的64×40的,从最小边40开始探索:
在这里插入图片描述
一直分割下去,直到找到一个8×8的方块,就是最小的解决问题的单元。
算法练习:
求顺序表中最大值:

#基本子算法(子问题规模小于或等于2时)
def get_max(max_list):
    return max(max_list)

#分治法
def solve2(init_list):
    n = len(init_list)
    if n<=2:  #若问题规模小于或等于2,解决
        return get_max(init_list)
    #分解(子问题规模为n/2)
    left_list,right_list=init_list[:n//2],init_list[n//2:]
    #递归(树),分治
    left_max,right_max=solve2(left_list),solve2(right_list)
    #合并
    return get_max([left_max,right_max])

if __name__=="__main__":
    test_list=[12,2,23,45,67,3,2,4,45,63,24,23]
    print(solve2(test_list))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值