递归

简介: 一、生活举例 二、递归案例三、递归求阶乘四、实现递归要满足两个基本条件五、慎用递归

递归

 

内容介绍:

一、生活举例

二、递归案例

三、递归求阶乘

四、实现递归要满足两个基本条件

五、慎用递归

 

 

一、生活举例

递归在生活中的案例:

image.png

这个故事与今天的知识点——递归有点像。

递归的这个概念是属于算法的范畴,本来不属于C语言的语法范畴,但是基本上在每个编程中都会讲到递归,那是因为如果掌握了递归的方法和技巧,就会发现是一个非常棒的编程思路,有时候绞尽脑汁都想不出的问题,用递归就可以轻松的实现。

 

例子:

1、汉诺塔游戏是来自于一位法国数学家曾经编写过的一个古老的印度传说,该游戏要求(将最左边的木块移动到最右边的柱子上去,每一步只能移动一块木块,并且只能小的木块在大的木块上面)

 

2、谢尔宾斯基撒三角形,一个大三角形里边分为很多个小三角形,一层接一层,只要空间够大,可以撑满整个小宇宙。

 

3、目录树的索引,在编程过程中会遇到目录索引访问的情景,需要一层一层的去访问目录,但不知道目录究竟有多少层,这时使用递归就是一个很好的方法。

 

4、女神的自拍。

 

递归的概念

递归从原理上来说,就是函数调用自身的行为。在函数内部可以调用其他函数,也可以调用其自身。

 

 

二、递归案例

函数调用本身(递归的实现)

#include <stdio.h>

void recursion(void) ;

void recursion(void)

{

static int count = 10;

printf("Hi!\n") ;

if (--count)

{

recursion();

}

}

int main(void )

{

recursion() ;

return 0 ;

}

 

运行:gcc test1.c ss ./a.out

结果:

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

 

注意!

递归必须要有结束条件.否则程序将崩溃!

没有返回值就会出现异常,如同下面的情况,会一直重复出现 Hi 并且报错。

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Hi!

Segmentation fault

 

 

三、递归求阶乘

写一个求阶乘的函数

——正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的整数。比如所给的数是5,则阶乘式是1X2X3X4X5,得到的积是120, 所以120就是5的阶乘。

5=120

 

以此为例:

#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;

}

测试一下:

运行:gcc test2.c ss ./a.out

结果:请输入一个正整数:5

5的阶乘是:120

结果:请输入一个正整数:10

10的阶乘是:3628800

执行流程:

1.  程序载入内存进入main

2.  用户输入一个值

3.  调用第一次factnum

4.  进入执行,一层一层执行,直到返回的数不满足  num >0

 

 

  • 假设我们的值传入是5,那么就拥有以下视图:

image.png

 

一层一层调用,直到不满足循环的条件就输出结果

递归递归,归去来兮,有去有来。

 

 

四、实现递归要满足两个基本条件

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

 

 

五、慎用递归

普通程序员用迭代,天才程序员用递归!

但我们宁可做普通程序员!!

以实现程序为目标。

 

相关文章
|
11月前
|
机器学习/深度学习 存储 自然语言处理
《神经符号计算:为自然语言处理开启新大门》
神经符号计算融合了神经网络和符号方法的优势,为自然语言处理(NLP)带来新契机。它结合了神经网络强大的特征提取能力和符号推理的逻辑分析能力,提升了语义理解的精准度,特别是在处理隐喻、模糊语言时表现突出。通过将知识图谱与神经网络结合,神经符号计算增强了多步推理能力,并实现了知识图谱的自动化更新。此外,它还提高了模型的可解释性和可信度,有助于突破黑盒限制,增强用户信任。尽管面临一些挑战,但其潜力巨大,有望推动NLP迈向更高智能水平。
384 13
|
编解码 安全 算法
【蓝牙系列】蓝牙5.4到底更新了什么(1)--- PAwR
蓝牙5.4规范中引入了一种新的逻辑传输“Periodic Advertising with Responses(PAwR)”,它能够支持无连接的双向应用程序数据通信。在这种技术支持下,ESL设备不需要经常性的切换接收模式,因此可以大大延长电池寿命,同时,基于PAwR的数据传输模式,保证数据传输与监听设备的相关性,从而减少能量的浪费,实现ESL设备接收数据并响应至发送器的能力。
1661 0
|
IDE 编译器 Linux
你应该搞懂的 C 语言头文件路径问题
聊聊系统路径位置,绝对路径与相对路径,正斜杠 `/` 与 反斜杠 `\` 使用说明 ...... by 矜辰所致
655 0
你应该搞懂的 C 语言头文件路径问题
|
C语言
【数据结构】C语言队列(详解)
【数据结构】C语言队列(详解)
535 0
|
存储 机器学习/深度学习 边缘计算
云边协同与人工智能AI的深度融合(云端训练、边端推理)
在面向物联网、大流量等场景下,为了满足更广连接、更低时延、更好控制等需求,云计算在向一种更加全局化的分布式节点组合形态进阶,边缘计算是其向边缘侧分布式拓展的新触角。
12784 0
|
Android开发
你要了解的USB接口知识总结
最近项目中有设计到USB接口,把一些常用的USB名词、常识以及关系总结一下。
1319 0
|
传感器 智能硬件
结合实际聊聊防反接电路(防反接电路总结)
电路小课堂,防反接电路哪里跑。
653 2
结合实际聊聊防反接电路(防反接电路总结)
|
安全 数据挖掘 芯片
聊聊电源自动切换电路(常用自动切换电路总结)
今天得聊聊电源自动切换电路,实际中需要使用并且用过,那就来记录总结一下。
747 1
聊聊电源自动切换电路(常用自动切换电路总结)
|
传感器 物联网 数据安全/隐私保护
蓝牙5.2新特性 Enhance ATT
了解Enhance ATT之前先回顾一下BLE的ATT,BLE两个设备连接之后,GATT的client端如何知道server端支持了哪些profile、服务,这个就需要ATT, ATT层提供了标准机制、协议、帧格式,用来发现读、读取、写入对端设备的属性,ATT有client 和serve两个角色。在ATT的下层是L2CAP,位于hci的上层,L2CAP提供了多路通道的复用,ATT层、SM层的数据都需要经过L2CAP层,L2CAP层通过标志位来区分不同的协议层的数据包。
625 0
蓝牙5.2新特性 Enhance ATT
|
传感器 安全 vr&ar
全面认识二极管,一篇文章就够了
电子设计基础元器件 二极管,小小二极管,大大用途。二极管作为最基础的晶体管,在电子电路应用中无所不在,不管是电平转换电路,电源自动切换电路,防反接电路,都有二极管的影子。
1898 1
全面认识二极管,一篇文章就够了