c语言,求c语言递归算法法的技巧?最好有经典例子!

博客访问: 166478
博文数量: 142
博客积分: 2130
博客等级: 大尉
技术积分: 1800
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
C语言递归方法
C语言函数可以自我调用。如果函数内部一个语句调用了函数自己,则称这个函数是“递归”。递归是以自身定义的过程。也可称为“循环定义”。
递归的例子很多。例如定义整数的递归方法是用数字1,2,3,4,5,6,7,8,9加上或减去一个整数。例如,数字15是7+8;数字21是9+12;数字12是9+3。
一种可递归的计算机语言,它的函数能够自己调用自己。一个简单的例子就是计算整数阶乘的函数factor()数N的阶乘是1到N之间所有数字的乘积。例如3的阶乘是1×2×3,即牵丁br& factor()和其等效函数fact()如例4-10所示。
非递归函数fact()的执行应该是易于理解的。它应用一个从1开始到指定数值结束的循环。
在循环中,用“变化”的乘积依次去乘每个数。
factor()的递归执行比fact()稍复杂。当用参数1调用factor()时,函数返回1;除此之外的其它值调用将返回factor(n-1)*n这个乘积。为了求出这个表达式的值,用(n-1)调用factor()一直到n等于1,调用开始返回。
计算2的阶乘时对factor()的首次调用引起了以参数1对factor()的第二次调用。这次调用返回1,然后被2乘(n的初始值),答案是2(把printf()语句插入到factor()中,察看各级调用及其中间答案,是很有趣的)。
当函数调用自己时,在栈中为新的局部变量和参数分配内存,函数的代码用这些变量和参数重新运行。递归调用并不是把函数代码重新复制一遍,仅仅参数是新的。当每次递归调用返回时,老的局部变量和参数就从栈中消除,从函数内此次函数调用点重新启动运行。可递归的函数被说成是对自身的“推入和拉出”。
大部分递归例程没有明显地减少代码规模和节省内存空间。另外,大部分例程的递归形式比非递归形式运行速度要慢一些。这是因为附加的函数调用增加了时间开销(在许多情况下,速度的差别不太明显)。对函数的多次递归调用可能造成堆栈的溢出。不过溢出的可能性不大,因为函数的参数和局部变量是存放在堆栈中的。每次新的调用就会产生一些变量的复制品。这个堆栈冲掉其它数据和程序的存储区域的可能性是存在的。但是除非递归程序运行失控,否则不必为上述情况担心。
递归函数的主要优点是可以把算法写的比使用非递归函数时更清晰更简洁,而且某些问题,特别是与人工智能有关的问题,更适宜用递归方法。递归的另一个优点是,递归函数不会受到怀疑,较非递归函数而言,某些人更相信递归函数。编写递归函数时,必须在函数的某些地方使用if语句,强迫函数在未执行递归调用前返回。如果不这样做,在调用函数后,它永远不会返回。在递归函数中不使用if语句,是一个很常见的错误。在开发过程中广泛使用printf()和getchar()可以看到执行过程,并且可以在发现错误后停止运行。
阅读(381) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。使用C语言求N的阶乘的方法
作者:低调小一
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了使用C语言求N的阶乘的方法,包括一道相关的ACM题目示例,需要的朋友可以参考下
用递归法求N的阶乘
程序调用自身称为递归( recursion).它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解.
递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
#include &stdio.h&
#include &string.h&
#include &stdlib.h&
long factorial(int n)
if(n == 1)
return n*factorial(n-1);
int main(int argc,char *argv[])
int n = 0;
if(argc != 2)
printf("input error,exit!!\n");
return -1;
n = atoi(argv[1]);
printf("%d! = %ld\n",n,factorial(n));
&&& 题目描述:&
&&&& 输入一个正整数N,输出N的阶乘。&
&&& 输入:&
&&& 正整数N(0&=N&=1000)&
&&& 输出:&
&&&& 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘&
&&& 样例输入:&
&&& 样例输出:&
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#define MAX 3000
//存储每次阶乘运算的结果
int str[MAX];
void calculateFactorial(int n);
int main()
while (scanf("%d", &n) != EOF) {
if(n == 0) {
printf("1\n");
calculateFactorial(n);
void calculateFactorial(int n)
int i, j, temp, c,
memset(str, 0, sizeof(str));
str[1] = 1;
for (i = 2, len = 1; i &= i ++) { //循环与2,3,..n相乘
for (j = 1, c = 0; j &= j ++) { //str数组代表一个数,模拟与i相乘
temp = str[j] * i +
str[j] = temp % 10;
c = temp / 10;
while(c & 0)
str[j ++] = c % 10;
len = j - 1;
for (i = i &= 1; i --) {
printf("%d", str[i]);
printf("\n");
&&& /**************************************************************
&&&&&&& Problem: 1076
&&&&&&& User: wangzhengyi
&&&&&&& Language: C
&&&&&&& Result: Accepted
&&&&&&& Time:2150 ms
&&&&&&& Memory:916 kb
&&& ****************************************************************/
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 汉诺塔递归算法c语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信