欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

设计与调用递归函数在C语言中:重新探索C语言中fun函数的递归特性

最编程 2024-08-12 08:26:37
...

函数是可以嵌套调用的,即在某一个函数中的语句可以是对另一个函数的调用,例如:

···

main()

{

float t;

int x,y;

t=fun1(x,y);

···

}

float fun1(int a,int b)

{

int z;

z=fun2(a+b,a-b);

···

}

int fun2(int m,int n)

{

···

}

···

fun1()和fun2()是两个独立的函数,在fun1的函数体内有包括了对fun2的调用。

在C语言中,除了函数的嵌套调用,还存在着另一种函数的调用形式:函数的递归调用。递归调用就是在函数中出现调用函数自身的语句,或者两个函数之间出现相互调用的情况,这种调用方式称为是递归调用,递归调用又分为直接递归调用和间接递归调用两种情况。

1. 直接递归调用

直接递归调用是指在函数定义的语句中,存在着调用函数本身的语句。

2. 间接递归调用

间接递归调用是指在不同的函数定义中,存在着相互调用函数语句的情况。

在C语言中,为了防止陷入无限的递归调用的状态,对于递归函数的设计是由严格的数学模型的,并不是所有的问题都可以设计成递归函数。

要想设计成递归函数在数学上必须具备以下两个特点:

1) 问题的后一部分与原始的问题类似。

2) 问题的后一部分是原始问题的简化。

这里要注意的是如果后一部分的问题出现的情况比原始问题复杂了,这时就不能再设计成递归函数了。

常见的就是求n阶乘或者是关于数列的、有规律变化的一些问题。

例如:编写程序要求从键盘输入一个正整数n,计算n!。

分析:n!的数学模型是符合设计成递归函数的数学模型的。

#include

long fun(int n)

{

long result;

if (n == 0 || n == 1)

{

result = 1;

}

else

{

result = n * fun(n - 1);//直接递归调用

}

return result;

}

int main()

{

int n;

long z;

printf("请输入一个数据n:\n");

scanf_s("%d", &n);

z = fun(n);

printf("%d!=%ld", n, z);

}

好了!今天的讲解就到这里了,欢迎大家积极与我讨论。

推荐阅读