什么递归
c语言允许函数调用自己,这种调用过程就叫递归。如下面的函数up_and_down:
#include <stdio.h>
void up_and_down(int);
int main(void){
up_and_down(1);
return 0;
}
void up_and_down(int n){
printf("level %d\n",n);
if(n < 4){
up_and_down(n+1);
}
printf("level %d\n",n);
}
输出的结果:
level 1
level 2
level 3
level 4
level 4
level 3
level 2
level 1
调用过程:
| 备注 | ||
|---|---|---|
| up_and_down(1) | level 1 | 调用up_and_down(2) ,把调用up_and_down(2) 处的下一条语指令入栈到函数调用栈 |
| up_and_down(2) | level 2 | 调用up_and_down(3) ,把调用up_and_down(3) 处的下一条语指令入栈到函数调用栈 |
| up_and_down(3) | level 3 | 调用up_and_down(4) ,把调用up_and_down(4) 处的下一条语指令入栈到函数调用栈 |
| up_and_down(4) | level 4 和 level 4 | 匹配上结束条件,执行到函数结尾,并开始弹出函数栈中的指令地址,继续执行前一个函数调用用 up_and_down(4)处的下一条指令地址,就是函数栈顶记录的指令地址 |
| 执行up_and_down(4)调用处的下一条语句 | level 3 | 在up_and_down(3)中调用了up_and_down(4) |
| 执行up_and_down(3)调用处的下一条语句 | level 2 | 在up_and_down(2)中调用了up_and_down(3) |
| 执行up_and_down(1)调用处的下一条语句 | level 1 | 在up_and_down(1)中调用了up_and_down(2) |
尾递归
尾递归是最简单的递归形式,它的特点就是将递归调用放在函数的末尾,即正好在return语句之前。它相当于循环:
#include <stdio.h>
int fact(int);
int rfact(int);
int main(void){
int a = fact(5);
int b = rfact(5);
printf("%d %d",a,b);
return 0;
}
// 循环
int fact(int n) {
long ans;
for(ans = 1;n > 1; n--) {
ans *= n;
}
return ans;
}
// 尾递归
int rfact(int n){
long ans;
if(n > 0){
ans = n * rfact(n - 1);
} else {
ans = 1;
}
return ans;
} 递归的优点为某些编程问题提供了很简单的解决方案,缺点是一些递归算法会快速消耗计算机的内存资源。有时递归算法不是很好阅读和维护。
到此这篇关于c语言的递归与尾递归的实现的文章就介绍到这了,更多相关c语言的递归与尾递归内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论