C语言中的递归函数写法
递归定义
一个函数在它的函数体内直接或间接地调用自身称为函数的递归调用,而这种函数被称为递归函数。
直接调用:是指函数直接调用自己。
间接调用:是指函数在递归函数调用的下层再调用自己。
例:直接调用,Function1()->调用Function1()
间接调用,Function1()->调用Function2()->Function2()->调用Function1()
讲解
递归函数简单的理解就是在不停地调用自己,如果不懂请参照 “讲解” 。
其实递归函数在使用时只需要明确一点:我写这个函数是干嘛用的,比如在用递归写计算N!的C语言程序时,只需要明确我写的函数是用来计算当前传入参数N与它前面(N - 1)! 的乘积,写起来就会很简单。
而且要明确一点,那就是:递归调用的时候必须要有终止条件,也就是递归终点。否则程序就会一直递归,直到栈溢出。(不用纠结,深入学习后就会知道)
例子
一 、用递归算法计算 N 的阶乘。
#include<stdio.h>
int F( int n ) //递归函数
{
long sum; //
if(n == 0 || n == 1) //递归终点。
return 1;
else
{
sum = n * F( n - 1 );
}
return sum; //函数返回sum的值。
}
int main()
{
int n;
scanf("%d", &n); //输入n
printf("%d! = %d\n", n, F(n));
return 0;
}
这是一个很简单的递归程序,但是包含递归的要素:
- 递归函数参数的设置与变化,如 sum = n * F(n - 1) 中的 n-1。在别的题中,我们要去找到那个递推公式,然后合理设置参数,就能很快的写出递归函数。
- 递归终点的设置,如 if(n == 0 || n == 1) return 1; 就是很标准的递归终点。在写递归函数时,我们必须先想好函数的递归终点,然后才能写递归函数。
- 函数的返回值,如本道题中的 return sum; 再别的题目中,要注意考虑到所有的情况,稍微复杂一点题目就很容易漏掉某种情况,然后没有返回值。
同时补充一点函数的知识,在定义函数的时候,原则上函数的类型就是返回值的类型,但是如果类型不一样,会强制类型转换为定义函数地类型的值然后返回。
二 、贪吃的猴子。
觉得上面的例子很简单,那么就让我们看一道稍微难一点的递归题。
有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一般加5个)。到第n天早上再想吃的时候,就只剩下一个桃子了。
输入:
天数n
输出:
第一天的桃子个数
提述:要先建立递推公式。
首先,就像我之前说的,明确我们写的递归函数是用来干嘛的,然后写出递推公式,明确递归终点,再写出递归函数。这道题就解决了。
那么,我们写的递归函数是用来干嘛的?根据题意,猴子每天吃掉前一天的一半加上天数个桃子。
所以我们写的递归函数就是计算第n天时剩余的桃子个数。然后建立递推公式:第 n 天剩余的桃子个数 =2*( 第 n+1 天剩余桃子数+ n )。
递归终点就是最后一天剩余桃子数为 1。然后我们就可以开始写递归函数了。
#include<stdio.h>
int n; //定义全局变量n,记录输入天数
int Taozi(