C语言之递归函数

目录

函数和类型

阶乘

█递归函数调用


函数中可以调用和该函数自身完全相同的函数,这样的调用方式称为递归函数调用,下面我们就来学习相关的基础知识。


函数和类型

所谓递归(recursive),就是将自己包含在内,或者用自己来定义自己。

我们用下面的图来说明:(ps:引用知乎@是花花吖图片)

显示器里面套着一个又一个显示器

通过采用递归的思考方式,从1开始无限延续的自然数1、2、3……就可以像下面这样使用有限的方式定义出来:

█自然数的定义

a 1是自然数

b 某个自然数后面的整数也是自然数

通过使用递归定义,无限存在的自然数就可以通过两个语句定义出来,不仅仅是定义,通过有效利用递归还可以使程序更加整洁。


阶乘

递归的另一个例子,就是求非负整数的阶乘。对于非负整数n的阶乘,可以采用如下方式进行定义:

█阶乘n!的定义(n为非负整数)

a 0!= 1

b 若n > 0,则n!= n*(n-1)!

例如,5的阶乘5!可以通过5*4!求得,而4的阶乘4!可以通过4*3!求得一直到1!= 1*0!,根据定义0!= 1

我们用程序来实现,如下:

#include<stdio.h>/*返回阶乘的值*/
int factorial(int n)
{if(n > 0)return n * factorial(n - 1);elsereturn 1;
}
int main()
{int num;printf("请输入一个整数:");scanf("%d", &num);printf("%d的阶乘是%d\n", num, factorial(num));return 0;
}

只要形参接收的值大于0,函数factorical就会返回到n * factorial(n - 1),否则,返回到1.

看起来虽然很简单,但在程序执行时是十分复杂的,下面让我们来看看是如何执行的:


递归函数调用

我们以求3的阶乘为例,看看函数factorical求阶乘的流程:

a   通过factorical(3)调用函数函数factorical,因此形参n会被传入3,所以该函数返回3*factorical(2),但是要知道函数factorical(2)的值,就必须以2为参数再次调用函数函数factorical。

b   被调用的函数函数factorical,将2传入形参n中,该函数返回2*factorical(1),想知道函数factorical(1),的值就必须以1为参数再次调用函数factorical


c    被调用的函数factorical,将1传入形参n中,为了进行1*factorical(0)的运算,调用函数函数factorical(0)


d     因为形参n接受到的值为0,所以函数factorical返回1

 大家参照下面的流程图来对应上面每一个步骤:(红色箭头是参数,黄色箭头是返回值)

接下来是递归:大家可以从下面中仔细考虑下体现出的递归意义

c  收到返回值1的函数factorical,返回1*factorical(0),即1*1

b  收到返回值2的函数factorical,返回2*factorical(1),即2*1

d  收到返回值3的函数factorical,返回3*factorical(2),即3*2

为了求得n-1的阶乘,函数factorical调用函数factorical,像这样的函数调用称为递归函数调用

递归函数调用与其说时调用函数本身,倒不如理解为调用和该函数同样的函数更加自然,如果是调用函数本身,则会一直调用下去,进入死循环。

 如果待处理的问题、函数或者数据结构已经具有递归定义,就可以使用递归算法。使用递归的方式求阶乘是为了大家能够更好地理解,但并不合适。

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

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

相关文章

ubuntu添加路由

ip route show 查看当前路由表 sudo ip route add /mask via 添加一条路由 目标ip 1.1.1.1/100 下一跳 2.2.2.2 sudo ip route add 1.1.1.1/100 via 2.2.2.2 dev ens160 proto static metric 100这是一条Linux命令&#xff0c;用于添加一个静态路由。具体含义如下&#xff1…

AI 绘画 | Stable Diffusion 视频数字人

前言 本篇文章教会你如何利用Stable Diffusion WEB UI,使用一个人物图片转换成为一个口播视频。本篇内容的教程以WINDOWS系统为例,教你如何安装使用。 先看视频效果 彭于晏图片生成口播视频 安装 首先需要在windows电脑上安装ffmpeg,按照本教程《在 Windows PC 上轻松下载并…

DataGrip 2023.3 新功能速递!

1 数据可视化 自 DataGrip 2023.3 发布以来&#xff0c;已整合 Lets-Plot 库&#xff0c;实现数据可视化。该可视化功能可用于所有三种类型的网格&#xff1a; 主选项卡&#xff1a;在打开表、视图或 CSV 文件时&#xff0c;在分割模式下显示图表。结果选项卡&#xff1a;在 服…

centos安装opencv并在springboot中使用

使用conda安装opencv&#xff0c;并在docker运行的容器中使用&#xff0c;这里以运行则springboot应用的容器为例 步骤一&#xff1a;安装 在conda中安装 # 安装依赖 conda install numpy matplotlib# 安装opencv conda install -c conda-forge opencv # 或者制定版本 conda…

安装android studio

记录一下安装android studio的过程&#xff1a; 1.首先安装android studio到某一文件夹后&#xff0c;在C盘用户目录下可以看到.android文件夹。C:\Users\22515\AppData\Local\Google目录下也会出现AndroidStudio2022.2文件夹。&#xff08;注意&#xff1a;用户名&#xff0c…

在iframe怎么把外面的dialog关掉

<template> <el-dialog ref"dialogRef"> <iframe></iframe> </el-dialog> </template> 在iframe怎么把外面的dialog关掉 在 Vue 中&#xff0c;如果要从 iframe 内部关闭外部的 dialog&#xff0c;可以通过在 iframe 中触发父…

一种缩小数据之间差距的算法

先上代码&#xff1a; /** * 缩小数据之间的差距&#xff0c;但是大小关系不变的方法* param {Array} features */function minMaxData(data) {for (let i 0; i < data.length; i) {const f data[i];const x f[1];const yf[2];//此处5根据实际情况设置const y2 Math.pow(…

LeedCode刷题---二分查找类问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、二分查找 题目链接&#xff1a;二分查找 题目描述 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一…

开源学习项目推荐

文章目录 koodo-reader凤凰架构学习项目NPS 内网穿透客户端 koodo-reader 项目地址&#xff1a;https://github.com/koodo-reader/koodo-reader 介绍&#xff1a;一个开源的阅读器&#xff0c;阅读pdf也有目录&#xff0c;作为epub阅读器和pdf阅读器看资料挺好 凤凰架构 项…

torch.gather(...)

1. Abstract 对于 pytorch 中的函数 torch.gather(input, # (Tensor) the source tensordim, # (int) the axis along which to indexindex, # (LongTensor) the indices of elements to gather*,sparse_gradFalse,outNone ) → Tensor有点绕&#xff0c;很多博客画各…

设计模式策略模式讲解和代码示例

引言 策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换。 原始对象被称为上下文, 它包含指向策略对象的引用并将执行行为的任务分派给策略对象。 为了改变上下文完成其工作的方式, 其他对象可以使用另一个对象来替换当前链接的策…

elastic:nested实现对满足条件的数组元素聚合查询

0. 引言 某些业务场景下&#xff0c;我们要对数组元素进行聚合查询&#xff0c;就需要用到nested数据类型&#xff0c;但部分场景是针对数组中指定的元素进行聚合&#xff0c;于是就需要对数组元素进行限定&#xff0c;今天来看看这种场景如何实现。 1. 数据准备 首先我们准…

【ECMAScript笔记一】初识JavaScript、变量的使用、数据类型包括哪些?

文章目录 1 初识JavaScript1.1 JS是什么1.2 JS的作用1.3 浏览器怎么执行JS1.4 编译性语言和解释型语言1.5 JS的组成1.6 JS的三种书写位置1.7 JS的注释1.8 JS的输入输出语句 2 变量2.1 变量的使用2.2 使用变量的注意点2.3 变量命名规范 3 数据类型3.1 简单数据类型3.1.1 数字型 …

6.s081操作系统Lab4: trap

文章目录 chapter 4概览4.1 CPU trap流程使用寄存器如果cpu想处理1个trap 4.2 用户态引发的trap4.2.1 uservec4.2.2 usertrap4.2.3 usertrapret和userretusertrapretuserret Lab4Backtrace (moderate)Alarm (hard) chapter 4 概览 trap的场景&#xff1a;系统调用&#xff0c…

2024年手把手教CleanMyMac X v4.14.6破解版安装激活图文教程

小编给您带来CleanMyMac X v4.14.6中文破解版&#xff0c;CleanMyMac X破解版是应用在MacOS上的一款Mac系统清理优化工具&#xff0c;使用cleanmymac x 中文破解版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。 CleanMyMac…

redis各种数据类型的应用场景

String应用场景 单值缓存 SET key value GET key 对象缓存 SET user:1 value(json格式数据)MSET user:1:name zhuge user:1:balance 1888 MGET user:1:name user:1:balance 分布式锁 SETNX product:10001 true //返回1代表获取锁成功 …

分布式锁业务场景驱动与共性

分布式锁线上真实案例架构设计哲学本质解剖 1. 业务场景驱动: ①. 交易商品库锁定,防止用户重复下单.②. MQ消息去重,防止消息重复消费:a. 发送端去重b. 消费端去重③. 订单操作变更协同:a. 在用户对商品下单后,订单状态为待支付,在某一时刻用户正在对该订单做支付操作,商家对…

Linux网络配置命令

ip man ip # 显示所有网络设备的状态 ip link show # 显示指定网络设备的详细信息 ip link show <device_name> # 启用网络设备 sudo ip link set <device_name> up # 禁用网络设备 sudo ip link set <device_name> down # 删除设备IP地址 sudo ip addr de…

使用案例总结Vlookup函数的30种用法

1 基础用法 =VLOOKUP(A12,B$1:D$8,3,0) 2 批量查找 =VLOOKUP(A11:A13,A2:C8,3,0) 3 模糊查找 =VLOOKUP("*"&D2&"*",A:B,2,0) 4 模糊查找2 =VLOOKUP(D10&"??",A:B,2,0) 5 模糊查找3 =

pycharm通过ssh连接远程服务器的docker容器进行运行和调试代码

pycharm连接远程服务器的docker容器通常有两种方法&#xff1a; 第一种&#xff1a;pycharm通过ssh连接已在运行中的docker容器 第二种&#xff1a;pycharm连接docker镜像&#xff0c;pycharm运行代码再自动创建容器 第一种方法比较通用简单&#xff0c;作者比较推崇。 条件…