带你学C带你飞 | 递归 | 快排

一、递归

1.递归

  有些非常复杂的问题,可以用递归轻松实现。

  • 汉诺塔
  • 谢尔宾斯基三角形
  • 目录树的索引

  函数调用自身就是递归。递归必须要有结束条件,否则程序将崩溃!因此,实现递归要满足两个基本条件:

  • 调用函数本身
  • 设置了正确的结束条件

举个栗子:递归求阶乘

#include <stdio.h>

long fact(int num);

long fact(int num)
{
   
        long result;
        
        if (num > 0)
        {
          
                result = num * fact(num-1);
        }       
        else
        {
          
                result = 1;
        }       
        
        return result;
}       

int main(void)
{
          
        int num;
        printf("请输入一个正整数:");
        scanf("%d",&num);

        printf("%d的阶乘是:%d\n",num,fact(num));
        return 0;
}
[liujie@localhost sle34]$ gcc test.c && ./a.out
请输入一个正整数:5
5的阶乘是:120

num = 0时触发结束条件,
在这里插入图片描述
  递归并没有在执行效率上有任何优势,相反,使用递归更加难以阅读与维护。

2.课后作业

  1. 请至少列举使用递归的三个缺点?
    答:递归的执行效率通常比迭代低很多,所以递归程序要更消耗时间;由于递归函数是不断调用函数本身,在最底层的函数开始返回之前,程序都是一致在消耗栈空间的,所以递归程序要“吃”更多的内存空间;递归的结束条件设置非常重要,因为一旦设置错误,就容易导致程序万劫不复(崩溃)。

  2. 如果不上机,你能看出下面代码会输出什么吗?

    #include <stdio.h>
    
    void up_and_down(int n);
    
    void up_and_down(int n)
    {
         
            printf("%d ", n);
            if (n > 0)
            {
         
                    up_and_down(--n);
            }
            printf("%d ", n);
    }
    
    int main(void)
    {
         
            int n;
    
            printf("请输入一个整数:");
            scanf("%d", &n);
    
            up_and_down(n);
            putchar('\n');
    
            return 0;
    }
    

    在这里插入图片描述

  3. 编写一个程序,反向打印用户输入的英文句子。

    #include <stdio.h>
    
    void getInput();
    
    void getInput()
    {
         
            int ch;
    
            if ((ch = getchar()) != '!')
            {
         
                    getInput();
            }
            else
            {
         
                    printf("反向输出:");
            }
    
            putchar(ch);
    }
    
    int main(void)
    {
         
            printf("请输入一句以感叹号结尾的英文句子:");
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值