再学C语言31:函数——递归

news2024/11/24 13:45:10

C允许一个函数调用其自身,这种调用过程被称为递归(recursion)

使用递归的风险:如果程序中没有设定可以终止递归的条件检测,会无限制地执行递归调用

所以涉及递归的程序需要谨慎设计

递归一般可以替代循环语句使用:有些需求使用循环语句更好;另一些需求使用递归更合适

整体上,递归方法虽然可以使程序结构优美,但其执行效率往往没有循环语句高

一、递归的使用

示例代码:使用递归实现图案显示

#include <stdio.h>

void symbol_print(int num);

int main(void)
{
    symbol_print(1);
    return 0;
}

void symbol_print(int num)
{
    int i;

    for(i = 0; i < num; i++)
    {
        printf("*");
    }

    printf("\n");

    if(num < 10)
    {
        symbol_print(num + 1);
    }

    for(i = 0; i < num; i++)
    {
        printf("*");
    }

    printf("\n");
}

运行结果:

ab6a16dcfaf3436c88b97943ad763965.png

同样的功能也可以使用for循环实现(不适用递归):

#include <stdio.h>

void symbol_print(num);

int main(void)
{
    int i;

    for(i = 0; i <= 10; i++)
    {
        symbol_print(i);
    }

    for(i = 10; i >= 0; i--)
    {
        symbol_print(i);
    }

    return 0;
}

void symbol_print(int num)
{
    int i;

    for(i = 0; i < num; i++)
    {
        printf("*");
    }

    printf("\n");
}

二、递归的基本原理

1)每一级的函数调用都有自己的变量

2)每一次函数调用都会有一次返回,当程序流执行到某一级递归的结尾处时,会转移到前一级递归继续执行,通过递归的每一级逐步返回

3)递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序

4)递归函数中,位于递归调用后的语句的执行顺序和各级被调用函数的执行顺序相反

5)虽然每一级递归都有自己的变量,但是函数代码并不会得到复制

6)递归函数中必须包含可以终止递归调用的语句

三、尾递归

尾递归:把递归调用语句放在函数结尾,即恰好在return语句之前,这是最简单的递归形式

递归调用出现在函数尾部,其作用相当于一条循环语句

当递归和循环都可以实现某功能时,选择循环更好一点

四、递归的优缺点

优点:

为某些编程问题提供最简单的解决方案,可以写出简洁的代码

缺点:

1)某些场景下递归算法太占用计算机内存资源

2)程序不易阅读和维护


注意:使用递归时必须特别小心,避免不当的使用导致系统瘫痪


一个程序中的每个C函数和其他函数之间是平等关系,每一个函数都可以调用其他任何函数或被其他任何函数调用

虽然main函数是一个有特殊性的函数(计算机总是从main函数中的第一句开始执行整个程序),但是也可以被其自身递归调用或被其他函数调用,虽然显示当中极少这么做

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mozi僵尸网络(P2P僵尸网络Mozi)

Mozi僵尸网络概述 Mozi僵尸网络是于2019年底首次出现在针对路由器和DVR 的攻击场景上的一种P2P僵尸网络。主要攻击物联网&#xff08;IoT&#xff09;设备&#xff0c;包括网件、D-Link和华为等路由设备。它本质上是Mirai的变种&#xff0c;但也包含Gafgyt和IoT Reaper的部分代…

springboot mybatis mysql快速开始(详细入门操作)(二)

七、创建service类。要注意相应的注解service,autowired不能丢&#xff0c;不然系统识别不到这些组件。里面写对应的mapper方法。Service public class SplineService { private static final Logger log LoggerFactory.getLogger(SplineService.class); Autowired private Sp…

国产音频ADC芯片的应用以及选型

想要让模拟信号和数字信号顺利“交往”&#xff0c;就需要一座像“鹊桥”一样的中介&#xff0c;将两种不同的语言转变成统一的语言&#xff0c;消除无语言障碍。这座鹊桥就是转换器芯片&#xff0c;也就是ADC芯片。ADC芯片的全称是Analog-to-Digital Converter, 即模拟数字转换…

设计模式_创建型模式 -《单例模式》

设计模式_创建型模式 -《单例模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 创建型模式的主要关注点是“怎样创建对象&#xff1f;”&#xff0c;它的主要特点是“将对象的创建与使用分离”。 这样…

广州蓝景分享—Web前端开发培训机构如何选择

首先Web前端培训机构如何选择&#xff1f;相信很多人都不是很清楚&#xff0c;就是听别人推荐哪家好哪家不好&#xff0c;没有合理性的去实地了解&#xff0c;看看是否符合自己。所以&#xff0c;最好的方法就是自己在网上可以找一些判断web前端培训机构的条件&#xff0c;然后…

nacos原理和实战问题解决方案

nacos原理和集群搭建实战&#xff0c;在开始之前、我们先要知道nacos的官网并熟悉其基本特性 官网介绍 一、原理&#xff1a; 1、多种注册中心对比 2、nacos作为注册中心的核心功能 2.1、服务注册&#xff1a; Nacos Client会通过发送REST请求的方式向Nacos Server注册自己…

ArcGIS基础实验操作100例--实验82聚集点空间特征分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验82 聚集点空间特征分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

Leetcode.60 排列序列

题目链接 Leetcode.60 排列序列 题目描述 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n!n!n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n3n 3n3 时, 所有排列如下&#xff1a; "123" "132" "213" …

二、TTY子系统框架

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、TTY子系统框架分析2、TTY数据处理流程3、驱动的目录结构及核心文件4、TTY在Linux下的分布1、TTY子系…

微信小程序使用

微信开发介绍微信公众号的二次开发&#xff0c;主要点后端配置交互&#xff0c;前端负责h5页面微信小程序和微信小游戏的开发&#xff0c;必须要依托于微信&#xff0c;方便宣传开放平台&#xff0c;公众平台小程序介绍2016年出来的&#xff0c;取缔app应用。传统的App应用开发…

Vue中动态展示数据的字典项

问题描述 今天在写自己网站的时候&#xff0c;遇到一个问题&#xff0c;不知道各位前端初学者有没有遇到过这个问题 如图所示&#xff1a;我通过接口查询到一些信息&#xff0c;有两个属性是枚举数据(魔法值) 我们称这种数据为字典项&#xff0c;因为开发中一般称0&#xff…

AWS Markeplace 上的 DolphinDB MGR 快速上手

1. AWS 上的 DolphinDB MGR 简介 DolphinDB MGR 是部署于 Kubernetes 上的 DolphinDB 集群自动运维系统&#xff0c;提供包括部署、升级、扩缩容、配置变更的 DolphinDB 全生命周期管理。通过 DolphinDB MGR&#xff0c;DolphinDB 可以无缝运行在公有云或私有部署的 Kubernete…

openEuler RISC-V 的 Firefox 性能大升级,最高 40 倍性能提升

RISC-V SIG 择日即将发布 openEuler RISC-V 22.03 V2 版本镜像。本次发版会提供带有 SpiderMonkey JIT 编译支持的 Firefox 最新版本和带有 LLVMpipe 优化的 Mesa 最新版本安装源供使用者选装测试&#xff0c;预期图形界面使用性能会获得可观优化。 新版本的 Firefox 开启 JIT…

5.3、UDP 和 TCP 的对比

在使用 TCP/IP 体系结构的网络通信中&#xff0c;这两个协议的使用频率仅次于网际层的 IP 协议 TCP/IP 体系结构应用层中的某些协议需要使用运输层的 TCP 提供的服务 而另一些协议需要使用运输层的 UDP 提供的服务 1、UCP(无连接) & TCP(面向连接) 1.1、UDP 如下所示&am…

小程序:会议OA项目-其它页面

目录 一、tabs组件及会议管理布局 自定义tabs组件 跟着官网来感受一下 会议管理的布局 二、个人中心布局 一、tabs组件及会议管理布局 自定义tabs组件 文档参考:自定义组件 | 微信开放文档 跟着官网来感受一下 先建一个文件夹名为components&#xff0c;里面再建一个tabs的…

【C语言进阶(NEW)】六、文件操作(一)|文件|文件的打开和关闭|文件的顺序读写|文件读取结束的判定

目录 一、文件 1.1 什么是文件 1.1.1 程序文件 1.1.2 数据文件 1.2 为什么使用文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2 文件的打开和关闭 三、文件的顺序读写 3.1 fgetc 和 fputc&#xff08;字符输入输出函数&#xff09; 3.2 fgets 和 fputs&am…

20行原生JS代码手写ElementUI表格组件

又是许久没有写博客了&#xff0c;这几年的疫情&#xff0c;总是居家&#xff0c;时间久了&#xff0c;慢慢的总会想很多。现在越发觉得想做的事情一定要尽早去做&#xff0c;不然总说等下一次&#xff0c;很多时候&#xff0c;就没有下一次了。 今天给大家分享一下如何用原生…

从0到1完成一个Vue后台管理项目(十七、使用Echarts:柱状图、折线图)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

DB性能跟不上,加缓存就够了?

服务端软件开发时&#xff0c;通常会把数据存储在DB。而服务端系统遇到的第一个性能瓶颈&#xff0c;往往发生在访问DB时。 这时大部分开发会拿出“缓存”&#xff0c;通过使用Redis在DB前提供一层缓存数据&#xff0c;缓解DB压力&#xff0c;提升服务端性能。 在数据库前添加…

nohup后台运行,进程查看与终止(ubuntu)

1.nohup用途&#xff1a;不挂断地运行命令。语法&#xff1a;nohup Command [ Arg … ] [ & ]无论是否将 nohup 命令的输出重定向到终端&#xff0c;输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写&#xff0c;输出重定向到 $HOME/nohu…