当前位置: 代码网 > it编程>编程语言>C/C++ > C语言的递归与尾递归的实现

C语言的递归与尾递归的实现

2026年09月08日 C/C++ 我要评论
什么递归c语言允许函数调用自己,这种调用过程就叫递归。如下面的函数up_and_down:#include <stdio.h>void up_and_down(int);int main(

什么递归

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语言的递归与尾递归内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com