如何理解C递归,所谓递归,说的简单点,就是函数自己调用自己,然后在某个特定条件下。结束这种自我调用。

想的简单点就是“自己调用自己”。而且也一直在重复着这个步骤,如果有条件可以停止,但是如果没有停下来的条件,那他会一直调用下去,它可以用简单的程序来解决某些复杂的计算问题。

c递归的语法

void recursion()
{
statements;
... ... ... recursion(); /* 函数调用自身 */
... ... ...
}
int main()
{
recursion();
}

如果还是对他有点迷茫的话,用一个流程图来详细了解:

归递 hive 归递 c_递归的c语言语法

在C语言中是支持递归的,函数可以调用自身,但是也会有一个问题,刚才开始的时候我就已经提到过了,如果没有响应结束的条件,c递归会进入死循环,所以在这里是要注意的。

C 语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。

递归函数在解决许多数学问题上起了至关重要的作用,比如计算一个数的阶乘、生成斐波那契数列,汉诺塔等等。我们一个一个来看看例子,记得要多加练习:

c递归实例

(1)数的阶乘

下面的实例使用递归函数计算一个给定的数的阶乘:

实例

#include
double factorial(unsigned int i)
{
if(i <= 1) { return 1; }
return i * factorial(i - 1);
}
int main()
{ int i = 15;
printf("%d 的阶乘为 %f\n", i, factorial(i));
return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

15 的阶乘为 1307674368000.000000

(2)汉诺塔:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。

如果只有一个盘子,那么我们可以直接将盘子从A移动到C。

如果有两个盘子,我们可以先把较小的盘子移到B上,把最大的盘子从A移动到C,再把较小的盘子从B移动到C。

如果有三个盘子,我们把上面两个盘子看作一个整体,把它们通过C移动到B,移为较大的在下小的在上的状态,把最大的盘子从A移动到C,再把B上的两个盘子通过A移动到C。

以此类推,我们可以可以得到如果有n个盘子时:

我们将上面(n-1)个盘子看作一个整体,把他们通过C移动到B,把最大的盘子从A移动到C,再把B上的(n-1)个盘子通过A移动到C。

实现:

void Move(char x,char y)//模拟一个盘子的移动
{
printf("%c->%c\n"x,y);
}
void Hanoi(int n,char A,char B,char C)
{
if(n==1) { Move(A,C); }
else { Hanio(n-1,A,B,C); //A上的通过C移到B
Move(A,C); //A->C
Hanio(n-1,B,A,C); //B上的通过A移到C }
}

这看着代码简单,但是你要想好逻辑最重要。

(3)斐波那契数列

下面的实例使用递归函数生成一个给定的数的斐波那契数列:

例如:

#include
int fibonaci(int i)
{
if(i == 0) { return 0; }
if(i == 1) { return 1; }
return fibonaci(i-1) + fibonaci(i-2);
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("%d\t\n", fibonaci(i));
}
return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

0 1 1 2 3 5 8 13 21 34

上面这些例子记住要好好练一练,在做递归的时候,学员们经常会出现一些问题,这里总结了一小点,记得记住,他们错的,你要掌握:

用递归方法必须要复合几个条件:

(1)可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。

说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。

(2)可以应用这个转化过程使问题得到解决

(3)必定要有一个明确的结束递归的条件

这些要记得,以后会出现类似的问题的。