c语言可以将代码模块化,这是其很重要的一个特性。

说道代码模块化,我们很自然的就会联想到函数。而函数中,比较难的一个知识点就是函数的递归调用。

值得注意的是,函数的递归调用在现实工作并不是很常用,但是涉及到算法或者是学校的考试的话,那这个知识点就成了必考的内容。所以,骚年,躲是躲不掉滴~~

好了,言归正传,首先,我们通过一个例子来具体看一下函数的递归调用。

例如,大家假期结束返回学校,生活费肯定是不可少的,什么?你说你不用生活费?原谅我不知道你是怎么活下来的……

于是,你就问A室友带了多少生活费,舍友A回答说,他比B多带了200块钱;于是你又去问B,B说他C同学多带了200块钱;于是你就去问C,C说他比D同学多带了200块钱;于是你只好又去问D,D说他比E同学多带200块钱,最终你得知E同学实际上带了1000块钱,那么请问A同学带了多少钱?

观察这道题,我们很容易的就可以解出A到底带了多少钱,但是,我们现在需要用代码的方式来解决这个问题。

我们看,这其实就是一个递归的问题。我们要求出A究竟带了多少钱,势必要从E同学的钱数上一层层的加200元,最终得出A的生活费。

也就是:

money(5)=money(4)+200;
money(4)=money(3)+200;
money(3)=money(2)+200;
money(2)=money(1)+200;
money(1)=1000;

这个过程其实可以分成两个阶段。第一个阶段是回流,就是说我向计算机输入一个值5,我是想得出A同学的钱数,但在此之前我必须找到B同学的钱数,以此类推,我必须得到具体的钱数,才能够停止回流的这个过程,也就是得到E同学的钱数1000元;第二个阶段就是计算了,得到了E同学的钱数之后,我们需要让E同学的钱数依次加上200,最终得出结果。

接下来我们用一个代码片段来实现这个过程:

int money(int n)
{
int c;
if (n == 1)
c = 1000;
else
c = money(n - 1) + 200;
return c;
}

可以看到,根据我们上面的理论,这个money函数一共被调用了4次。注意:这都是在函数内部的调用,一个函数调用一个函数,直到n的值为1的时候停止,所以最后需要加的是800,然后返回最终的结果。

这就是我们讲的函数的递归调用,也就是函数本身调用自己。但是应用递归调用的时候,我们有必要设置一个条件,也就是if语句,目的是能够让这个函数停下来,否则程序将进入到死循环,一般不是我们想看到的。

我们可以自己尝试一下n!的解题方法,我就不给出了,大家可以尝试一下!

同为小白,愿与诸君共勉!

附上我的另一篇文章:c语言自增自减运算符

结语

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗

邮箱:roobtyan@aliyun.com

个人博客:https://roobtyan.github.io

c语言:函数的递归调用的更多相关文章

  1. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  2. day14 迭代器,生成器,函数的递归调用

    1.什么是迭代器 迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续 迭代取值的工具 2.为什么要用迭代器 迭代器的优点 ​ ①不依赖于索引取值 ​ ②更节省内存 缺点: ​ 1.不如按 ...

  3. C语言函数的递归和调用

    函数记住两点: (1)每个函数运行完才会返回调用它的函数:每个函数运行完才会返回调用它的函数,因此,你可以先看看这个函数不自我调用的条件,也就是fun()中if条件不成立的时候,对吧,不成立的时候就是 ...

  4. Java中函数的递归调用

    说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的. public class HelloWorld { public static void ...

  5. C51函数的递归调用

    前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...

  6. [C++程序设计]函数的递归调用

    在调用一个函数的过程中又出现直接或间接地调用 该函数本身,称为函数的递归(recursive)调用. 包含递归调用的函数称为递归函数. 在实现递归时,在时间和空间上的开销比较大 求n! #includ ...

  7. python--内置函数、匿名函数、递归调用

    匿名函数 有名函数: def func1(x): print(func1) 结果: <function func1 at 0x00000000005C3E18> 匿名函数: func2=l ...

  8. [转]在C#中调用C语言函数(静态调用Native DLL,Windows & Microsoft.Net平台)

    原文:https://blog.csdn.net/yapingxin/article/details/7288325 对于不太了解.Net的人,如果想要了解.Net,我必须给他介绍P/Invoke.P ...

  9. oracle数据库中函数的递归调用

    如有下面的表结构AAAA,用一个字段prev_id表示记录的先后顺序,要对其排序,需要用的递归函数 ID PREV_ID CONT 99   a 23 54 d 21 23 e 54 33 c 33 ...

随机推荐

  1. 记录:JAVA抽象类、接口、多态

    JAVA抽象类.接口.多态 1. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...

  2. 51nod 1055:最长等差数列

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  取消关注 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 ...

  3. Jenkins实现自动打包,MAVEN打包,Shell脚本启动

    1.点击New任务 2.创建任务,输入项目名 3.输入描述等 4.选择Git或SVN 5.自动,定时打包 6.在Build下配置

  4. 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  5. SQLAlchemy建立数据库模型之间的关系

    一对多关系 多对一关系 多对多关系 一对一关系 一对多关系(一个作者,多篇文章) ## 一对多关系,单作者-多文章,外键不可少 ## 外键(ForeignKey)总在多的那边定义,关系(relatio ...

  6. 103-PHP定义一个类

    <?php class ren{ //定义人类 } class mao{ //定义猫类 } new ren(); //实例化人类 new mao(); //实例化猫类 new mao(); // ...

  7. Mysql 终端中文显示乱码

    查看编码 show variables like 'char%'; 结果 +--------------------------+--------+ | Variable_name | Value | ...

  8. RabbitMQ整合Spring Booot【消费者补偿幂等问题】

    如果消费者 运行时候 报错了 package com.toov5.msg.SMS; import org.springframework.amqp.rabbit.annotation.RabbitHa ...

  9. Power BI Premium

    Power BI Premium的设计是为了满足拥有大量数据的大公司的需求.微软已经重新构建了Power BI的架构,以允许大量的“只读”用户.Premium用户还可以利用很多新功能. Power B ...

  10. C++ do while无限循环~

    #include<iostream> using namespace std; #include<Windows.h> int main() { ; ; system(&quo ...