讲递归之前,先来讲一个故事:
从前有座山,山里有座庙,庙里有个老和尚在讲故事,讲的是:从前有座山,山里有座庙,庙里有个老和尚在讲故事,讲的是:……
没错这就是递归(高情商:哇~这就是递归啊懂了懂了;低情商:就这就这?这不就是套娃嘛)
……没错,就是套娃。但是我们仔细想一下就知道,这样无限套娃下去,函数的运行就像吃了炫迈一样根本停不下来,所以这时候我们就要规定一个递归结束条件。也就是说要找到参数为啥时,递归结束,直接返回结果。
示例1:
7-2 求阶乘问题 (15 分)
输入一个正整数n,输出n!。
输入格式:
输入在一行中给出1个正整数n。
输出格式:
在一行中输出n!的值。
输入样例:
4
结尾无空行
输出样例:
24
思路:
首先我们应该知道某个数的阶乘公式为N!=1x2x3x……xN;
然后我们开始套娃:N!= N x (N-1)! (N-1)! = (N-1) x (N-1-1)!;...以此类推即函数f(n)=n*f(n-1);
那什么是截止的条件呢?由阶乘的公式可以知道,运行到f(1)的时候就结束了。
完整代码:
#include<stdio.h>
double f(double n){
if(n==1)return 1;//结束条件:当套娃到f(1) 的时候直接返回值
return f(n-1)*n;
}
int main(){
double n;//这里用double是为了给变量n更大的储存空间。
scanf("%lf",&n);
printf("%.0lf",f(n));
return 0;
}
示例2:
7-3 递归实现逆序输出整数 (15 分)
本题目要求读入1个正整数n,然后编写递归函数reverse(int n)实现将该正整数逆序输出。
输入格式:
输入在一行中给出1个正整数n。
输出格式:
对每一组输入,在一行中输出n的逆序数。
输入样例:
12345
结尾无空行
输出样例:
54321
思路:以12345为例,按从低位到高位每次打印一个数,可以想到用求余的运算来获取每一位数 ,即n%10,打印出5;然后如何获得第二个数呢?先执行n/10的操作,可以得到1234,再进行取余得到4……;当只剩下最后一个个位数时结束递归,所以结束条件就是:if(n<10).
完整代码:
#include<stdio.h>
void reserve(int n){
if(n<10)printf("%d",n);//结束条件,当n只剩下一位时直接打印
else{
printf("%d",n%10);//打印取余求得的数
n/=10;
reserve(n);
}
}
int main(){
int n;
scanf("%d",&n);
reserve(n);
return 0;
}