分治算法 递归法 非递归法

Windows操作系统应用实验报告册

开课学院: 计算机与软件学院
实验项目: 分治算法实验
实验时间: 2020.9.25
实验地点: 15310
指导教师:
学生姓名:
学生学号:
专业班级: 18软工软件2班

2019-2020学年第2学期

正文格式
实验目的

1.了解分治策略算法思想及基本原理
2.掌握使用分治法求解问题的一般特征
3.掌握分解、治理的方法
4.能够针对实际问题,能够正确的分解、治理,设计分治算法。
5.能够正确分析算法的时间复杂度和空间复杂度

一、 实验平台

Pycharm,Python
二、 实验内容
已知一个按关键字大小有序排列的元素序列,a, a2,…,an,判定某给定的元素x是否在该表中出现。
A)若是,则找出x在表中的位置并返回其所在下标;
B)若非,则返回0值。

四、算法设计
1.问题分析
step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

step3 合并:将各个子问题的解合并为原问题的解。

2.问题建模
构造一个函数,有终止条件的情况下不断循环
3.算法描述
算法描述:基本思想及策略
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。
如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

三、 算法源码
递归:


```python
a=[1,2,4,5,8,9,10,13,20]

def find(i,l,r):
    if l<=r:
        mid=int((l+r)/2)
        if a[mid] == i:
            return mid
        elif i < a[mid] and i>=a[mid-1]:
            find(i, l, mid-1)
        elif i>a[mid] and i<=a[mid+1]:
            find(i, mid+1, r)
        else:
            return -1

    else:
        return -1

if __name__ == '__main__':
    print(find(8,0,8))
    print(find(3,0,8))

 
非递归:

```python
a=[1,2,4,5,8,9,10,13,20]

int
def find(i):
    l = 0
    r = 9
    mid = ((l + r) / 2)
    while (l <= r):
        mid=int((l+r) / 2)
        if a[mid] == i:
            return mid
        elif i < a[mid]:
            r=mid-1
        else :
            l=mid+1
        return -1;

if __name__ == '__main__':
    print(find(8))
    print(find(3))

六、测试数据
递归法
列表:1,2,4,5,8,9,10,13,20
分别输入:8,0,8
3,0,8
分别输出4
-1
非递归:
列表:1,2,4,5,8,9,10,13,20
分别输入:8
3
分别输出 4
-1

七、程序运行结果(要求:截图说明算法运行的结果)
递归:
在这里插入图片描述

非递归:
在这里插入图片描述

八、实验总结
1.实验中遇到的问题及解决方法
构造函数的时候应该放置对应的参数,并且在函数里面的时候应该不断更新参数
非递归终止运行的时候应该设置终止运行条件
2.实验收获
更加透彻的了解了一个递归算法含义,算法很有趣,有点像俄罗斯套娃,让我做出了每天刷两道算法题的打算。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值