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

相关内容

热门资讯

申报新三板挂牌17月未过审!利... 导读:重数传媒新三板挂牌申请的审核时长已明显大幅超越了同期申报企业,其第三次A股上市进程再度陷入缓慢...
天阳科技:公司服务于以银行为主... 证券之星消息,天阳科技(300872)07月22日在投资者关系平台上答复投资者关心的问题。 投资者提...
泰凯英IPO:北交所细分行业龙... 来源:挖贝网 据《北京证券交易所上市委员会2025年第15次审议会议公告》显示,北京证券交易所上市委...
太平洋证券研究院副院长刘国清离... 来源:市场资讯 来源:金融人事mini 今年初,原华金证券研究所所长孙远峰加盟太平洋证券担任总经理助...
AWS上海AI研究院解散 官方... DoNews7月23日消息,22日,AWS 亚马逊云科技上海 AI 研究院的首席应用科学家王敏捷发朋...
天弘2只光伏基金跌麻了!三年半... 作者 |郑理 各家公募二季度报告陆续揭开面纱,1.2万亿公募巨头天弘基金管理有限公司(下称“天弘基金...
连亏四年割肉券商,锦龙股份跨界... 手握两张券商牌照的锦龙股份(000712.SZ)正在寻求转型。 7月23日,锦龙股份公告称,公司与广...
悉尼华人区15位业主“合伙卖房... 《澳洲金融评论报》7月23日报道,家住悉尼华人区Carlingford的居民Mario Gabrae...
石破茂证实日美达成协议:美对日... 当地时间23日,日本首相石破茂在直播记者会上称,日本与美国就关税问题达成一致,美方将向日本征收15%...
资金大举净流入这类ETF 受基建、煤炭板块大涨影响,资金强势流入相关ETF,本周前两个交易日,建材ETF(516750)等吸引...
6.52万元/平米!绿城46.... 苏州住宅楼板价纪录再次被绿城中国(03900.HK)刷新。 7月23日,江苏省苏州市两宗住宅地块成功...
原创 3... 在股市,资金多还是少赚钱都难,小凡玩ETF只是不会踏空,那些玩股票的冷暖自知。 牛市第一阶段玩ETF...
GTC泽汇:美元承压与黄金资产... 年初以来,美元持续走弱,维持在多年低点附近,其贬值并非短期波动,而是长期趋势延续的结果。这一局面使得...
原创 从... 当“反内卷”政策遇上了万亿级别的雅下水电大规模投资政策,对周期行业来说,无疑迎来了重要性的发展机遇。...
A股又蹦迪!万亿成交藏玄机?内... 来源:倪卫涛 今天A股又把散户玩明白了:指数创新高,你怕得想割肉;刚卖完就拉升,回头一看大腿拍肿。内...
雅下水电概念横空出世!恒立钻具... 7月21日至23日,A股雅下水电概念连续大涨。 图源:图虫 其中,恒立钻具(836942.BJ)连...
多地市场监管部门约谈外卖平台,... 南都讯 记者李玲7月18日,市场监管总局开展行政约谈,要求饿了么、美团、京东进一步规范促销行为,理性...
原创 被... 雷达财经鸿途出品 文|姚柏臣 编|孟帅 7月18日晚,家居零售巨头美凯龙发布的一则公告引发行业关注:...
上证综指盘中突破3600点!业... 上证综指盘中再创年内新高。交易行情数据显示,7月23日盘中,上证综指突破3600点,最高达3613....
机器人ETF易方达(15953... 截至收盘,中证装备产业指数下跌1.3%,中证芯片产业指数上涨0.8%,国证机器人产业指数下跌1.0%...