计算机算法设计与分析 第2章 递归与分治策略 (笔记)

简介: 计算机算法设计与分析 第2章 递归与分治策略 (笔记)

第2章 递归与分治策略

 

2.1 递归的概念

直接或间接调用自身为递归。

采用递归的目的(思路)是将一个较大(或较复杂)的问题分解成较小的相同问题。

使用递归方法时,一定要设置结束递归的边界条件。

递归的实现的关键是建立递归调用工作栈。(但使用时并不需要我们去建立,系统自动进行这个操作。)

递归的优点是形式简单,缺点是运行效率低(多次调用函数耗费大量时间、空间,问题规模较大时无法在规定时间内完成)。

例-阶乘】 阶乘函数 n!

可用递归函数定义:

n! = 1          ,n=0

      n(n-1)!  ,n>0

递归函数必须有非递归定义(直接给定)的初始值

第一式给出初始值,第二式给出用较小自变量表示较大自变量的函数值的式子。

用C++表示:

int factorial(int n) {
  if( n == 0)
    return 1;
  else
    return n*factorial(n-1);
}

例-斐波那契数列

数列1,1,2,3,5,8,13,21,...为斐波那契数列。

F(n) = 1                    , n = 0或1

F(n) = F(n-1)+F(n-2)  n>1

C++表示:

int fibonacci(int n){
  if (n<=1)
    return 1;
  else
    return fibonacci(n-1)+fibonacci(n-2);
}


【例-Hanoi塔问题】

汉诺塔问题是一个经典的可用递归解决的问题。

问题简述:

设有3个塔座,记为a,b,c

开始时a上一共叠有n个圆盘,圆盘从下到上,由大到小地叠在一起。

要求把a上的n个圆盘移到b上,仍按照上小下大的顺序叠放。

规则是每次只能移动一个盘子,且大盘子不能压在小盘子上。

 

使用递归方法分析这个问题:

当n=1时,将这个盘子放在b上即可

n>1时,先把n-1个盘子放在c上,再把最大的那个放在b上,接着把n-1个盘子放在b上。

void hanoi(int n, int a, int b, int c) {  //把a上的n个圆盘移到b上
    if(n>0){               //n>0,(有盘子时执行下面操作,n=0就放完了,结束)
        hanoi(n-1,a,c,b);  //把a上的n-1个圆盘移到c上,b是中转站
        move(a,b);         //移动剩下的那个大圆盘
        hanoi(n-1,c,b,a);  //将c上的n-1个圆盘移到b上,a是中转站
    }
}

2.2 分治法的基本思想

分治法的基本思想是将一个规模为n的问题 分解为 k个规模较小的子问题。子问题相互独立与原问题相同

递归地解这些子问题,然后将各子问题地解合并得到原问题的解。

 【例-二分搜索技术】

给定以排序的n个元素a[0,n-1],要在这n个元素里找一特定元素x。

若使用顺序搜索方法逐个比较x和a[]中的元素,最坏情况下要对比完所有的n个元素,时间复杂度O(n)。


使用二分搜索可在O(logn)时间完成搜索。基本思想如下:

将n个元素分为个数相当的两半,取a[n/2]与x比较,

若x= a[n/2],找到x,算法终止;

若x<a[n/2],则x在a[n/2]左侧,在a[n/2]左侧搜索;

若a>[n/2],x在a[n/2]右侧,在a[n/2[右侧搜索。

 

template<class Type>
int BinarySearch(Type a[],const Type& x,int n){
    int left = 0;
    int right = n-1;
    while(left<=right){
        int middle = (left+right)/2;
        if(x==a[middle])
            return middle;
        if(x>a[middle])
            left = middle+1;
        if(x<a[middle])
            right = middle-1;
    }
    return -1;
}


相关文章
|
6天前
|
算法
计算机算法设计与分析(1-6章 复习笔记)
计算机算法设计与分析(1-6章 复习笔记)
|
6天前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
20 7
|
7天前
|
算法 前端开发 Java
探讨Java中递归构建树形结构的算法
探讨Java中递归构建树形结构的算法
6 1
|
3天前
|
机器学习/深度学习 存储 算法
算法学习:递归
算法学习:递归
11 0
|
4天前
|
算法
二叉树删除节点算法---递归
二叉树删除节点算法---递归
|
4天前
|
算法
|
6天前
|
搜索推荐 算法 前端开发
计算机Java项目|基于协同过滤算法的体育商品推荐系统
计算机Java项目|基于协同过滤算法的体育商品推荐系统
|
1天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
15 6
|
1天前
|
算法 调度
基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图
**摘要:** 实现变异混合蛙跳算法的MATLAB2022a版车间调度优化程序,支持动态调整工件和机器数,输出甘特图。核心算法结合SFLA与变异策略,解决Job-Shop Scheduling Problem,最小化总完成时间。SFLA模拟蛙群行为,分组进行局部搜索和全局信息交换。变异策略增强全局探索,避免局部最优。程序初始化随机解,按规则更新,经多次迭代和信息交换后终止。
|
12天前
|
算法
基于GA-PSO遗传粒子群混合优化算法的VRPTW问题求解matlab仿真
摘要: 本文介绍了考虑时间窗的车辆路径问题(VRPTW),在MATLAB2022a中进行测试。VRPTW涉及车辆从配送中心出发,服务客户并返回,需在指定时间窗内完成且满足车辆容量限制,目标是最小化总行驶成本。文章探讨了遗传算法(GA)和粒子群优化(PSO)的基本原理及其在VRPTW中的应用,包括编码、适应度函数、选择、交叉、变异等步骤。同时,提出了动态惯性权重、精英策略、邻域搜索、多种群和启发式信息等优化策略,以应对时间窗限制并提升算法性能。

热门文章

最新文章