递归:
在函数的调用中,有一种特殊的情况,比如一个函数直接的间接的调用自身,称其为函数逇递归调用。
递归调用有两种形式:
直接递归:在一个函数中调用自身
间接递归:在一个函数中调用其他函数,而在其他函数中又调用了本函数
递归调用主要包含两个步骤:递推和回归,我们利用函数的递归调用,分解为相对简单而且可以直接求解的子问题(递推阶段)然后这个子问题的结果逐层进行回带求职,最终求得原来复杂问题的解(回归阶段)
注意:
递归算法设计简单,但是相比较非递归耗时和占内存
设计一个正确的递归过程需要注意此过程需满足递归条件,需具备递归结束条件
最后,通常递归函数常用来计算阶乘、级数、指数运算。
举个例子求数的阶乘
代码如下:
#include<iostream>
using namespace std;
//使用递归调用 打印函数阶乘
int Fac(int n) {
if (n < 0) {
cout << "error" << endl;
return(-1);
}
else if (n <= 1) {
return(1);
}
else {
return(n*Fac(n - 1));
}
}
int main() {
int Fac(int n);
int n;
cout << "please input n:" << endl;
cin >> n;
cout << "n!=" << Fac(n) << endl;
system("pause");
return 0;
}
汉诺塔问题
问题描述
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置的金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上
刚好看B站的时候看到李永乐老师说过这个问题。感兴趣的小伙伴可以去看看
https://www.bilibili.com/video/BV1gJ41177fX/?spm_id_from=333.788.videocard.0
如果一共64层我们按照分析结果一共有1800亿亿步,如果我们一秒钟移动一次,需要5800亿年,宇宙形成到现在只有 138亿年。所以说为了简单点。我们只考虑4层的情况
代码如下:
#include <iostream>
using namespace std;
void hanoi(int N, char A, char B, char C)
{
if (N == 1)//在只有一个盘子的情况下,直接从A到C
cout << A << "-->" << C << endl;
else
{//接下按照前面分析的,将前N-1(3)个借助C移到B上
hanoi(N - 1, A, C, B);
cout << A << "-->" << B<< endl;//将第n(4)个移到C上
//对前N-1个递归操作
hanoi(N - 1, B, A, C);//将对B上的前N-1(3)个借助A,移到C上,结束
}
}
int main()
{
int N;
cout << "请输入所要移动盘子的个数:" << endl;
cin >> N;
cout << "移动步骤如下:" << endl;
hanoi(N, 'A', 'B', 'C');
system("pause");
return 0;
}
结果: