目录
以下是递归的基本:
一.递归
1.概念:一个函数不仅可以调用其它的函数,还能调用自己,这种自己调用自己称为递归
2.模型:递归有点像剥洋葱,一层套着一层,直到掰到最里层
3.效果:把较为复杂的问题想成一个个小问题,有规律的循序渐进
4.使用注意:当问题规模足够小或者达到边界条件停止递归
洛谷:将一个很大的任务分解成规模小一些的子任务->子任务分解成更小的子任务->直到遇到初始条件
二.递归函数
看一下这个故事:
从前有座山,山里有座庙,庙里有个老和尚,老和尚再给小和尚讲故事:“从前有座山,山里有座庙,庙里有个老和尚,老和尚再给小和尚讲故事:“从前有座山,山里有座庙,庙里有个老和尚,老和尚再给小和尚讲故事:“太困了不讲了不讲了”,于是都回去睡觉了。”于是都回去睡觉了。”
不难发现,这其实就是一个老和尚给小和尚讲故事的无限循环,我们可以将这个故事转化为:
void 讲故事(){
if (困了) return;
讲故事();
回去睡觉;
}
那我们又假设递归是拆快递:
void 拆快递(){
打开盒子;
if(有东西){
拿走;
}else 拆快递();
合上盒子;
return ;
}
能帮我们更好理解到递归自己利用自己的概念
# 实战
这道题用循环很简单,可是我们要用递归函数,so:
思路:我们假设a(n)是n的阶乘,不难发现,a(n)=a*n*(n-1),那么要计算a(n),则是调用 a(n-1)->a(n-2)->......->a(1).
这道题的递归做法如下:
#include<iostream>
using namespace std;
long long a(int n){
if(n==1) return 1;
return n*a(n-1);
}
int main(){
ios::sync_with_stdio(false); //加快速度
int n;
cin>>n;
long long m=a(n);
cout<<m;
}
明天挑战做递归好题!!