文章目录
递归基础
关于递归
我们先通过一个形象的例子感受一下递归:
一个小朋友坐在第 10 排,他的作业本被小组长扔到了第 1 排,小朋友要拿回他的作业本,怎么办呢?他可以拍拍第 9 排小朋友,说:“帮我拿第 1 排的本子”,而第 9 排的小朋友可以拍拍第 8 排小朋友,说:“帮我拿第 1 排的本子”…如此下去,消息终于传到了第 1 排小朋友那里,于是他把本子递给第 2 排,第 2 排又递给第 3 排…终于,本子到手啦!
在函数内部,可以调用其他函数。如果一个函数在内部调用自己本身,这个函数就是递归函数。
如果一个函数在调用自己, 则被调用的”自己”再调用“自己”, 想象一下, 这将会无限循环下去, 所以递归函数中肯定有办法在某种情况下停止调用自己, 即停止递归, 一般来说使用 if 语句实现在满足特定的条件下终止递归。
2.函数不再递归的情况称作基本情形( base case, 也称基本情况)。
3.函数调用自身来执行子任务的情况就称作递归情形( recursive case )。
递归函数的格式如下:
递归函数格式如下:
函数类型 函数名(形参1)
{
if(条件1)
该条件下的函数值;
else if(条件2)
另一种条件下的函数值;
......
执行操作并进行递归调用;
}
递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大的减少程序的代码量。
我们用代码来模拟一下小朋友拿作业本的情景。
#include <bits/stdc++.h>
using namespace std;
void solve(int n){
if(n > 1){
cout << n - 1 <<"排的同学,帮我拿一下第一排的作业"<< endl;
solve(n-1);
}
cout <<"我是第"<< n <<"排的同学,我拿到作业了"<< endl;
}
int main(){
solve(10);
return 0;
}
程序的运行结果是:
9排的同学,帮我拿一下第一排的作业
8排的同学,帮我拿一下第一排的作业
7排的同学,帮我拿一下第一排的作业
6排的同学,帮我拿一下第一排的作业
5排的同学,帮我拿一下第一排的作业
4排的同学,帮我拿一下第一排的作业
3排的同学,帮我拿一下第一排的作业
2排的同学,帮我拿一下第一排的作业
1排的同学,帮我拿一下第一排的作业
我是第1排的同学,我拿到作业了
我是第2排的同学,我拿到作业了
我是第3排的同学,我拿到作业了
我是第4排的同学,我拿到作业了
我是第5排的同学,我拿到作业了
我是第6排的同学,我拿到作业了
我是第7排的同学,我拿到作业了
我是第8排的同学,我拿到作业了
我是第9排的同学,我拿到作业了
我是第10排的同学,我拿到作业了