图解算法之分而治之

博客介绍了分而治之算法,需找出尽可能简单的基线条件,并不断分解问题直至符合该条件。还以农场主分土地为例,详细说明了如何运用此算法将土地均匀分成最大方块,最后提到要编写sum函数代码。

分而治之
(1)找出基线条件,这种条件必须尽可能简单
(2)不断的将问题分解,直到符合基线条件。
举个例子
假设你是一个农场主,你有一块土地。
在这里插入图片描述
你要将土地均匀的分成快,且分成的土地尽可能的大。首先找出基线条件,最容易处理的情况,就是一条边的长度是另外一条板凳整数倍。
在这里插入图片描述如果一边长25m,另一边长50m,那么可使用的最大方块为25m * 25m。换言之,可以将这块地划分成两个这样均匀的方块。

找出递归条件,每次递归调用都必须缩小问题的规模,如何缩小前述问题的规模?我们首先找出这块地可容纳的最大方块。

在这里插入图片描述你可以从这块地划出两个640m * 640m的方块,同时余下一小块640m*400m的地。同时对余下的这块地也使用相同的算法。
在这里插入图片描述最初要划分的土地尺寸为1680m * 640m,而现在要划分的土地更小,为640m * 400m,适用于这小块地的最大方块,也是适用于整块地的最大方块。

再次使用同样的划分方法,对于640m * 400m的土地,可从中划出的最大块地为400m * 400m。
在这里插入图片描述这将余下一块更小的土地,其尺寸为400m * 240m;
以此类推,余下的这块土地满足基线条件,因为160是80的整数倍,将这块土地分成两个方块后,将不会再余下任何土地。
在这里插入图片描述因此,对于最初的那片土地,适用的最大方块是80m * 80m.
代码,请编写前述sum函数的代码

1 请编写前述sum函数的代码

def sum(list):
    if list ==[]:
        return 0
    else:
        return list[0]+sum(list[1:])
  2 请编写一个递归函数来计算列表中的元素数
  def count(list):
    if list==[]:
        return 0
    else:
        return len(list[1:])+1
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值