算法小课堂(二)递归与分治
创始人
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;
}

相关内容

热门资讯

王凤英入职小鹏3年终获股权,此... 5月7日消息,小鹏汽车披露的监管及年报信息显示,公司总裁王凤英已正式进入股东名册,入职小鹏3年后股权...
五块钱红酒卖断货,便宜红酒为何... 最近一段时间,中国的酒类消费市场可以说是显得格外奇怪,一方面,各种高端酒特别是白酒的消费量出现了明显...
财联社C50风向指数调查:4月... 财联社5月8日讯(记者 夏淑媛)新一期财联社“C50风向指数”结果显示,市场机构对4月新增人民币贷款...
央视硬刚国际足联拒掏20亿,背... 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 央视这次太刚了,离世界杯开幕还有1个月,死活...
新CEO上任直接放大招!Air... 快科技5月8日消息,苹果即将上任的CEO John Ternus对未来一系列新产品充满信心,称这些设...
“特朗普拟邀英伟达、波音等CE... 据路透社当地时间5月7日报道,特朗普政府正邀请英伟达、苹果、埃克森美孚、波音等大公司首席执行官,于下...
世界杯,还能看到直播吗? 2026年美加墨世界杯距离开幕,仅剩一个多月时间。多方信息显示,中央广播电视总台(以下简称“央视”)...
机构警告AI芯片热潮风险,超威... 5月7日,据央视财经,隔夜超威半导体公司(AMD)股价飙升近19%,带动AI芯片热潮持续升温。AMD...
银行员工转走储户1800万最新... 银行员工转走储户1800万最新进展:2名储户已收到银行全部款项
原创 中... 1994年,安徽省的经济格局曾发生过一次戏剧性的转折。在那一年,一座名为安庆的城市,其国内生产总值(...
昆都仑区:政策“蓄力”消费焕新 “一台5000多元的空调,叠加‘国补’和商场的以旧换新活动,能优惠1000元左右,旧机还能免费上门拆...
乐悦置业竞得佛山顺德乐从镇一商... 观点网讯:5月6日,佛山市顺德区乐从镇一商业地块成功出让,由广东省乐悦置业有限公司竞得,乐从南区·邻...
原创 亦... 《爱情没有神话》这部剧,一开始的命运颇为多舛,经历了几次撤档的波折后,终于在观众面前亮相,但其首播的...
美联储34年最大分歧叠加油价飙... 美联储按预期维持利率不变,但内部出现34年来最严重分歧,叠加布油创2022年6月以来新高,美债遭抛售...
支付宝消费券回收后,资金是否支... 摘要: 支付宝消费券回收变现后,资金能否直接转入信用卡?本文解答到账方式的相关规则,帮助用户了解资金...
中医介绍5个化痰穴位!收藏这篇... 很多人忽略了“痰”的危害,觉得咳几下就没事,殊不知,肺里的痰长期堆积,只会一步步加重身体负担。 中医...
黄金平台“杰我睿”涉嫌经济犯罪... 红星资本局5月7日消息,深圳水贝知名金店“杰我睿”兑付困难事件有了新进展。日前,深圳市公安局罗湖分局...
多地出台购房新政促楼市升温 记... 今年的“五一”假期,伴随着多个城市楼市新政密集落地,在叠加市场信心持续修复的作用下,房地产市场热度持...
谁是五一“吸金王”?这5座城市... 来源:市场资讯 (来源:21城市观) 哪座城市成为“五一”假期的大赢家? 图源:摄图网 作者|赵晓...
“低招低裁”格局稳固劳动力市场... 智通财经APP获悉,美国上周初请失业金人数在经历前一周回落至近几十年来最低水平后出现小幅反弹,表明尽...