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

相关内容

热门资讯

在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...