C语言中自我递归的几个例子

递归

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。

递归函数必须有结束条件。

递归分为回推和递推两个阶段,当一直回推,直到遇到墙后返回,这个墙就是结束条件。

所以递归要有两个要素,回推墙与递推关系


例题

计算n的阶乘

#include <stdio.h>

int factorial(int n)

{

int result;

if (n<0)                                          //判断例外

{

printf("输入错误!\n");

return 0;

} else if (n==0 || n==1)

{

result = 1;  //回推墙

}

else

{

result = factorial(n-1) * n;  //递推关系,这个数与上一个数之间的关系。

}

return result;

}

int main(){

int n = 5;                                              //输入数字5,计算5的阶乘

printf("%d的阶乘=%d",n,factorial(n));

return 0;

}

程序在计算5的阶乘的时候,先执行递推,当n=1或者n=0的时候返回1,再回推将计算并返回。由此可以看出递归函数必须有结束条件。

递归函数特点:

1. 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;

2. 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;

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

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

5. 递归函数中必须有终止语句。

一句话总结递归:自我调用且有完成状态。


例题

小明为了学好英语,需要每天记单词,第一天记1个,第二天记2个依次类推,请用代码完成,算出小明第10天开始的时候会了多少个单词?

分析:

回推墙是“第一天记1个”

递推关系是“第n天记的单词= 第n-1天记的单词数量+n"

#include <stdio.h>

/* 定义获取单词数量的函数 */

int getWordNumber(n)

{

if(n == 1)

{

return 1;    //回推墙

}

else{

return getWordNumber(n-1)+n ;       //递推关系

}

}

int main()

{

int num = getWordNumber(10);     //获取会了的单词数量

printf("小明第10天记了:%d个单词。\n", num);

return 0;

}


例题

有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后 问第1个人,他说是10岁。请问第5个人多大?

程序分析:

利用递归的方法,递归分为回推和递推两个阶段。要想知道第5个人岁数,需知道第4人的岁数,依次类推,推到第1人(10岁),再往回推。

#include <stdio.h>

/*

* 请使用递归函数完成本题

* 小编已将正确代码放在左侧任务的“不知道怎么办”里

* 小编希望各位童鞋独立完成哦~

*/

//定义一个函数,传送人员序号进去,返回该序号员工的年龄。

int getAge(numPeople)

{

//定义返回的年龄

int age;

//如果是第1个人的时候,年龄为10岁

if(numPeople==1)

age=10;  //这是回推墙,也就是结束递归的条件。

else

//还没接触到回推墙,就自我调用,谓之递归。

age = getAge(numPeople-1)+2;  //年龄等于上一个人的年龄加2

return age;

}

int main()

{

printf("第5个人的年龄是%d岁", getAge(5));

return 0;

}


例题

猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。

#include <stdio.h>

//定义一个函数,输入第n天,返回该天剩下的桃子数

int getPeachNumber(n)

{

int num;    //定义所剩桃子数

if(n==10)

{

num=1;       //递归结束条件,即回推墙

return num;

}

else

{

num = (getPeachNumber(n+1) + 1) * 2;   //递推关系

printf("第%d天所剩桃子%d个\n", n, num); //天数,所剩桃子个数

}

return num;

}

int main()

{

int num = getPeachNumber(1);

printf("猴子第一天摘了:%d个桃子。\n", num);

return 0;

}

时间: 2024-10-07 16:59:37

C语言中自我递归的几个例子的相关文章

C语言中的递归

思路 下图描述的是从问题引出到问题变异的思维过程: 概述 本文以数制转换为引,对递归进行分析.主要是从多角度分析递归过程及讨论递归特点和用法. 引子 一次在完成某个程序时,突然想要实现任意进制数相互转换,于是就琢磨,至少涉及以下参数: 源进制数:scr 目标进制:dest_d实现的大致思路: scr --> 数字分解 --> 按权求和 --> dest很明显这个过程是先正序分解,然后逆序求和,所以我就联想到了递归. 递归 1. 递归的含义 递归就是递归函数.递归函数是直接或间接调用自身的

c语言--函数与递归

1.函数又叫方法,是指实现某项功能或完成某项任务的代码块 //函数的主体从大括号开始,从大括号结束 //函数组成 //main函数,是给系统调用的函数 //函数组成: 返回值, 函数名, 传入参数 //如: 实现两个整数相加,返回它们的和 void show(void) { printf("hello world!\n"); } int add(int x, int y) { return x+y; } int main(int argc, const char * argv[]) {

一起talk C栗子吧(第一百六十八回:C语言实例--C语言中的布尔--bool类型)

各位看官们,大家好,上一回中咱们说的是控制终端字符颜色的例子,这一回咱们说的例子是:C语言中的布尔–bool类型 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在数字电路中我们经常会遇到布尔类型,其实在编写软件的过程中也会使用布尔类型.布尔类型的变量只有两种值:真和假.在实际的编程过程中,我们经常定义宏,然后使用1表示真,0表示假.下面是具体的例子: #define TRUE 1 #define FALSE 0 例子中定义了两个宏,一个是TRUE,它的值是1,表示真:另外一个是F

C语言中的预处理指令和递归

C语言中的预处理指令和递归 上个月就完成了黑马程序员的IOS基础视频教程,还记得刚开始学的时候,什么都不懂,现在学完基础感觉真的很不错! 每天都在期待着去黑马,憧憬着以后的生活.去黑马的路越来越接近了,我真的好兴奋!这些天一直在复习,感觉C语言中的预处理指令和递归都忘得差不多了. 预处理指令:是在编译器把代码编译成0跟1之前就会执行的一些指令.所有的预处理指令都是以#开头的. 预处理指令分为三种: 1.宏定义 用法--如:#define MYINT  int   表示把右边的int 在本代码以下

C语言中内存分配

C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重点介绍C程序中内存的分配,以及C语言编译后的可执行程序的存储结构和运行结构,同时还介绍了堆空间和栈空间的用途及区别. 第2节主要介绍C语言中内存分配及释放函数.函数的功能,以及如何调用这些函数申请/释放内存空间及其注意事项. 3.1 内存管理基本概念 3.1.1 C程序内存分配 1

C语言中函数和指针的参数传递

最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的.所以就产生了一些东西.和我们本来想的有差别. 一.明确C语言中函数的入口: C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来

让你提前认识软件开发(23):如何在C语言中执行shell命令?

第1部分 重新认识C语言 如何在C语言中执行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在许多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上,同时shell操作在Linux的编程中占有很重要的地位,这就需要开发人员熟练掌握在C语言中执行shell命令的相关操作. 本文用实际的代码演示了如何在C语言程序中执行shell命令,为相关软件开发工作的开展提供了参考. [关键词] Linux  C语言  shell  命令  开发 一.程序执行流程

C语言中的自定义函数

C语言中可以使用系统函数也可以使用自己的函数,就是自定义函数 自定义函数分为四种 第一种:无参无返回值的 函数的声明 void sayH(); 函数的实现 void sayH(){ printf("你好"); } 第二种:有参数无返回值 函数的声明: void pxsbx(int c,int k); 函数的实现: void pxsbxx(int c,int k){ int i,j; for (i=0; i<c; i++) { for (j=0; j<=i; j++) { p

浅谈C语言中的强符号、弱符号、强引用和弱引用

摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了C语言中的强符号.弱符号.强引用和弱引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑