算法小课堂(二)递归与分治
创始人
2025-05-31 02:51:42
0

一、概念

1.1相关概念

算法设计与分析是计算机科学的一个重要领域,其目的是设计高效的算法并评估其性能。递归与分治是算法设计与分析中两个基本的概念。

递归是一种解决问题的方法,其中问题被逐步分解为更小的子问题,直到问题的规模变得足够小,可以直接解决。递归算法通常包括一个递归函数,该函数调用自身来解决更小的子问题,直到达到基本情况,然后返回结果。递归算法在许多领域都有应用,如排序、搜索、树和图等数据结构的操作。

分治是一种算法设计策略,其中问题被分成相互独立的子问题,这些子问题分别求解,然后将它们的解合并起来以得到原始问题的解。分治算法通常包括三个步骤:分解、解决和合并。在分解阶段,原始问题被分成若干子问题;在解决阶段,每个子问题独立求解;在合并阶段,将所有子问题的解合并为原始问题的解。分治算法通常用于处理复杂问题,如归并排序、快速排序等排序算法,以及大规模的并行计算等领域。

1.2应用场景

  1. 排序算法:许多排序算法都是通过递归或分治来实现的,如归并排序和快速排序。

  2. 数据结构操作:二叉树、图等数据结构的遍历和操作通常采用递归算法实现。

  3. 搜索算法:许多搜索算法都可以通过递归实现,如深度优先搜索和广度优先搜索。

  4. 图像处理:图像处理中的一些算法,如图像分割和特征提取,可以使用分治算法来加速计算。

  5. 数学计算:递归算法可以用于计算复杂的数学问题,如计算斐波那契数列或计算组合数。

  6. 数据压缩:分治算法可以用于数据压缩中的哈夫曼编码和算术编码。

  7. 并行计算:分治算法可以用于并行计算中,通过将问题分成多个子问题,每个子问题可以在不同的处理器上独立计算。

1.3递归和迭代的区别

递归和迭代都是程序设计中常用的控制流程结构,二者的主要区别在于实现方式和使用场景。

        递归是一种通过函数调用自身来解决问题的方法。递归函数在处理问题时将其拆分为若干个规模较小但结构相同的子问题,然后通过递归调用自身来处理这些子问题。递归函数通常包括两部分:基线条件和递归条件。基线条件指的是问题规模缩小到一定程度后可以直接得出答案的情况,递归条件指的是需要不断缩小问题规模的情况。递归的实现通常简单直观,但可能会导致函数调用栈溢出或运行效率较低等问题。

        迭代是一种通过循环结构来解决问题的方法。迭代函数通过循环控制语句来重复执行某一段程序,直到达到特定条件为止。迭代通常需要使用变量来记录状态信息,以便在下一次循环时更新状态。迭代的实现通常比递归更高效,但可能会导致代码复杂度较高。

        一般来说,递归更适用于问题具有递归结构的情况,例如树形结构、分治算法等。而迭代更适用于问题具有迭代性质的情况,例如循环处理、动态规划等。在实际应用中,需要根据具体情况选择适合的方法来解决问题。

1.4局限性

  1. 递归深度限制:递归算法的缺点之一是可能存在递归深度限制。如果递归深度太大,可能会导致栈溢出或者超时等问题。

  2. 内存开销:分治算法通常需要创建许多临时数组或者其他数据结构来存储中间结果,这会导致额外的内存开销,尤其是在处理大规模数据时。

  3. 子问题之间相互依赖:有些问题可能存在子问题之间相互依赖的情况,这种情况下分治算法无法有效地工作。

  4. 算法复杂度:虽然递归和分治算法通常可以提高算法性能,但是在某些情况下,它们的时间和空间复杂度可能不是最优的。

二、相关问题

2.1例题汉诺塔

汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?(每次只能移动1个盘子,大盘子只能放在小盘子下面)

思路分析

具体思路如下:

  1. 将圆盘从起始柱子移动到目标柱子需要借助空闲柱子,因此需要找到空闲柱子。
  2. 将起始柱子上的n-1个圆盘移动到空闲柱子上,此时起始柱子上只剩下最大的圆盘。
  3. 将起始柱子上的最大圆盘移动到目标柱子上。
  4. 将空闲柱子上的n-1个圆盘移动到目标柱子上,此时所有圆盘都在目标柱子上。

递归算法的具体步骤如下:

  1. 判断当前要移动的圆盘数量,如果只有一个圆盘,则直接移动到目标柱子。
  2. 如果圆盘数量大于1,则先将n-1个圆盘从起始柱子移动到空闲柱子,再将最大的圆盘从起始柱子移动到目标柱子,最后将n-1个圆盘从空闲柱子移动到目标柱子。
#include 
using namespace std;void hanoi(int n, char start, char end, char temp) {if (n == 1) {cout << "Move disk 1 from rod " << start << " to rod " << end << endl;return;}hanoi(n - 1, start, temp, end);cout << "Move disk " << n << " from rod " << start << " to rod " << end << endl;hanoi(n - 1, temp, end, start);
}int main() {int n;while(cin>>n&&n){hanoi(n, 'A', 'C', 'B');}return 0;
}

2.1林大OJ:564汉诺塔-递归

Description

从前有一座庙,庙里有三个柱子,柱A柱 B柱 C。柱A有64个盘子,从上往下盘子越来越大。要求庙里的老和尚把这64个盘子全部移动到柱子C上。移动的时候始终只能小盘子压着大盘子。而且每次只能移动一个。
现在问题来了,老和尚相知道将柱A上面前n个盘子从柱A搬到柱C搬动方法。要求移动次数最少。

Input

输入有多组,每组输入一个正整数n(0 

Output

每组测试实例,输出每一步的步骤,输出“number..a..form..b..to..c”。表示将第a个盘子从柱b搬到柱c.

Sample Input

2

Sample Output

number..1..form..A..to..B
number..2..form..A..to..C
number..1..form..B..to..C
#include 
using namespace std;void movement(int num, char a, char b) {printf("number..%d..form..%c..to..%c\n", num, a, b);
}void hanoi(int n, char A, char B, char C) {if (n == 1) {movement(1, A, C);} else {hanoi(n-1, A, C, B);movement(n, A, C);hanoi(n-1, B, A, C);}
}int main() {int n;while (~scanf("%d",&n)) {hanoi(n, 'A', 'B', 'C');}return 0;
}

2.1林大OJ:896喜闻乐见汉诺塔

Description

现在有三根柱子(分别在左边,中间,右边),最左边柱子上有n个圆盘,从小到大依次摞着,现在我想把这n个圆盘移动到最右边的柱子上。 移动必须满足如下要求: (1):每个圆盘不能直接从最左边移到最右边(必须经过中间的杆子),同时也不能直接从最右边移到最左边。 (2):在移动的过程中必须保证小盘在大盘上面

Input

输入数据由多行组成,每行包含一个整数n(1<=n<=35)。

Output

对于每个测试样例,输出将n个盘移到最右边的最少次数。

Sample Input

1
3
12

Sample Output

2
26
531440

Hint

用递推的思想,先考虑规模为N-1的情况,再考虑由N-1扩展到N。

公式法

#include 
#include using namespace std;// 求解移动最小的次数
long long hanoi(int n)
{if (n == 1)return 2;  // 只有一个盘子时需要移动2次return 3 * hanoi(n - 1) + 2 ; // 其他情况根据递推公式求解
}int main()
{int n;while (cin >> n){cout << hanoi(n) << endl;}return 0;
}

2.2林大OJ:1762fibnacci--递归版

Description

 已知数列 1   1    2      3     5     8    13  

Input

计算第n项的值  (1<=n<=15)

Output

输出题意

Sample Input

3

Sample Output

2
#include 
using namespace std;int fibonacci(int n) {if (n <= 2) {return 1;}return fibonacci(n-1) + fibonacci(n-2);
}int main() {int n;cin >> n;cout << fibonacci(n) << endl;return 0;
}

矩阵快速幂模板

矩阵快速幂是一种高效求解斐波那契数列的方法,可以将时间复杂度降到O(log n)级别。

#include 
#include 
using namespace std;// 定义矩阵类型
typedef vector> matrix;// 矩阵乘法
matrix multiply(const matrix& A, const matrix& B) {int n = A.size(), m = A[0].size(), k = B[0].size();matrix C(n, vector(k));for (int i = 0; i < n; i++) {for (int j = 0; j < k; j++) {for (int p = 0; p < m; p++) {C[i][j] += A[i][p] * B[p][j];}}}return C;
}// 矩阵快速幂
matrix matrix_pow(matrix A, int n) {matrix ans(A.size(), vector(A.size()));// 初始化为单位矩阵for (int i = 0; i < ans.size(); i++) {ans[i][i] = 1;}while (n > 0) {if (n & 1) {ans = multiply(ans, A);}A = multiply(A, A);n >>= 1;}return ans;
}// 计算Fibonacci数列的第n项
long long fibonacci(int n) {if (n <= 0) {return 0;}matrix A = {{1, 1}, {1, 0}};  // 初始矩阵matrix ans = matrix_pow(A, n-1);return ans[0][0];
}int main() {int n;while(cin >> n){cout << fibonacci(n) << endl;}return 0;
}

相关内容

热门资讯

走进小城看消费丨江西资溪:低碳...   夏日时节下午4点,江西省抚州市资溪县大觉山景区漂流终点依然热闹。来自南昌的游客余鑫漂流结束后没有...
【中原晨会0625】市场分析专... 来源:市场资讯 (来源:中原证券研究所) 本期重点研报目录 【中原策略】市场分析:电子半导体领涨 ...
南向资金连买4日!低费率+可月... 6月25日早盘,港股红利资产震荡整理。截至11时14分,港股红利低波ETF招商(520550)下跌0...
618成交破百万!紫荆花用一套... 一年一度的618年中大促,是消费市场的晴雨表,也是品牌间最激烈的角力场。当各大品牌在直播间里铆足了劲...
原创 黄... 2026年6月25日的国际金价已经从前期的5500美元高点跌到4200美元下方,累计跌幅超过22%,...
英伟达CEO:Vera Rub... 截至9:38,中证半导体材料设备主题指数(931743)涨2.36%创新高;权重股中,中微公司涨3....
再被催债16亿!“钢铁大王”戴... 澎湃新闻记者 贺梨萍 因“铁本事件”入狱五年的戴国芳重返钢铁行业,但他并没有完成从阶下囚再到“钢铁大...
周三原油价格下跌 随着美国和伊朗在和平谈判中取得进展,越来越多的油轮公开穿越霍尔木兹海峡,原油在战时的价格上涨已经蒸发...
这种蛋白是大脑衰老的开关 这种蛋白是大脑衰老的开关 清晨,假设一位五十岁左右的王女士发现自己常常把手机放在熟悉的抽屉里又找不到...
信通院牵头算力Token出海生... 盘面上,截至11:04,中证科创创业50指数(931643)涨1.68%,创历史新高;权重股中,芯原...
海外 774 亿营收背后:日本... 文 | 游戏价值论 6月23日,彭博社报道了腾讯正在围绕出售多家日本游戏工作室少数股权开展谈判,包...
餐饮“抢人”大战:把店开到公交... 作者 |餐饮老板内参 内参君 医院、公交站、演唱会…餐饮品牌,正在无孔不入 在北京儿童医院,肯德基...
快讯 | 外资扫货!陈翊庭:港... 港交所行政总裁陈翊庭在接受《中国证券报》专访时指出,国际资本对中国资产的看法已彻底扭转,布局中国市场...
2777.77元!A股“股王”... 25日早盘,昨天创下历史新高的A股“股王”联讯仪器,今天上午继续走强,盘中股价再度刷新历史新高。 截...
原创 今... 欧洲自己的媒体直接下结论,欧盟衰退躲不掉,内部分裂拦不住,现在就连欧洲顶尖工业巨头,都偷偷在用中国的...
黄仁勋股东大会放言:本轮AI基... 在当地时间6月24日的英伟达(NVDA.O)2026年度股东大会上,股东批准了该公司全部10名董事会...
国际油价大跌 新华社消息, 纽约原油期货主力合约价格24日盘中跌破每桶70美元,为伊朗战事爆发以来首次。 市场分析...
马云带队插秧,什么信号? 一场别开生面的“务农”,让外界看到了一个不一样的阿里巴巴。 近日,阿里巴巴合伙人、高德董事长刘振飞在...
全球最大产能,最高丰度达99.... 本文转自【科技日报】; 6月23日,高丰度硼-10同位素技术暨产业化成果发布会在山东省东营市举办,全...
黄金大跳水!金饰克价年内暴跌近... 25日,现货黄金盘中震荡,截至发稿,报3985.070美元/盎司,跌0.17%。 当地时间24日,...