函数递归与汉诺塔

article/2025/9/18 0:15:52

C初阶之函数递归

函数递归基本原理

什么是递归?程序调用自身的编程技巧称为递归recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。其实递归主要就是压栈的过程。其递归的主要思想即:大事化小事
当然,递归也不是程序无限调用自身(会发生栈溢出),在使用递归时,必须满足两个必要条件:
1.存在限制条件,当满足这个限制条件后,递归便不在继续。
2.每次递归调用之后越来越接近这个限制条件(类似循环)。

通过例题来分析递归

递归的作用就是大事化小事

例题一:递归实现求n的阶乘

题目分析:
如果要求一个数的阶乘,比如求5的阶乘,就是5!=54321,这里要使用递归来实现,就必须推导出递归公式以及限制条件。
可以这样来想,5的阶乘可以表示为:
54!
5
43!
5
432!
54321!
54321
从以上的式子不难推导出递归公式:n!=n*(n-1)!
限制条件:当n==1时结束
根据分析可以写出代码

long long Fac(int N)//如果给的N很大,就不能用int类型来存放,所以在这使用long long类型
{if (N == 1)return 1;return N * Fac(N - 1) ;
}
int main()
{long long ret = Fac();printf("%d",ret);return 0;
}

图例分析
在这里插入图片描述
执行结果:
在这里插入图片描述
例题二:递归实现strlen的模拟(求字符串的长度)
题目分析:
要模拟实现strlen来求字符串的长度,可以使用函数的递归来做,大事化小事
比如说要求"hello"这个字符串的长度,可以这样想:
长度:1+("ello"的长度)
1+("llo"的长度)
1+("lo"的长度)
1+(“o"的长度)
1+(”/0"的长度)遇到 ‘\0’ 递归结束
在c语言中定义字符串用的是指针
char* str=“hello”
但是变量str指向的是字符串中第一个字符的地址,所以说每次递归后,str都要向后移动一位。
通过以上分析,可以得到该题的递归公式:1 + my_strlen(1 + str);
以及限制条件:*str==’\0’?
所以可以得到执行代码:

int my_strlen(char* str)
{if ('\0' == *str)return 0;elsereturn 1 + my_strlen(1 + str);
}
int main()
{char* str = "hello";int ret=my_strlen(str);printf("%d",ret);return 0;
}

图例分析:
在这里插入图片描述

执行结果:
在这里插入图片描述

结语

递归是C语言中常用的一种执行方法,就是大事化小事简化代码。是以后编程的基础,也非常的重要,在以后的数据结构学习中也会使用递归(二叉树的递归),所以掌握递归是非常必要的

附加递归经典题型:汉诺塔

分析:
有三个平面A,B,C,现在有若干个(n个)盘子,得从A盘移动到C盘,问有要分多少次移动。
若n=1,可以直接从A移动到C,一次移动
若n=2,先把一个移动到B上,再把另一个移动到C上,再把小的移动到C上,共3次。
若n=3,根据以上规律可得,先把上面2个移动到B上(3次),再把最底下的移动到C上(1次),再把那2个通过A中转移动到C上(3次),共七次。
通过分析可以得到一下代码:

void move(char p1, char p2)//汉诺塔
{printf(" %c->%c ",p1,p2);//先定义一个移动函数
}
void han(int n, char p1, char p2, char p3)
{if (n < 2){move(p1, p3);}else{han(n - 1, p1, p3,p2);move(p1, p3);han(n - 1, p2, p1, p3);}}int main()
{han(1, 'A', 'B', 'C');printf("\n");han(2, 'A', 'B', 'C'); printf("\n");han(3, 'A', 'B', 'C');return 0;
}

执行结果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/OMhLY7Fl.shtml

相关文章

分治算法的解和幂乘算法及其优化以及汉诺塔算法的介绍

分治算法就是分成若干个和原问题一样性质的子问题&#xff0c;然后逐步递归这些子问题&#xff0c;直到遇到规模很小的子问题&#xff0c;求出子问题的解&#xff0c;归结成原问题的解的算法就是分治算法 分治算法为递归问题&#xff0c;可以用来解决快排、二分归并、斐波那契数…

递归求解汉诺塔问题(详细解答)

汉诺塔移动步数的计算 具体汉诺塔的规则大家自行百度吧&#xff0c;就不介绍了&#xff0c;这里介绍一下如何求解汉诺塔移动步数的计算思想。 当汉诺塔层数为一层时&#xff0c;很显然只需要一步&#xff0c;直接从A杆移动到C杆 当层数为两层时&#xff0c;则需要三步&#x…

汉诺塔算法

2019独角兽企业重金招聘Python工程师标准>>> 有A、B和C 3跟柱子&#xff0c;在A上从下往上按照从小到大的顺序放着64个圆盘&#xff0c;以B为中介&#xff0c;把盘子全部移动到C上。移动过程中&#xff0c;要求任意盘子的下面要么没有盘子&#xff0c;要么只能有比它…

汉诺塔算法的理解

2019独角兽企业重金招聘Python工程师标准>>> 当盘子数为两个时&#xff0c;移动图如下&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AB22AC31BC 当盘子数为3个时&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AC22AB31CB4…

汉诺塔递归算法

2019独角兽企业重金招聘Python工程师标准>>> import java.util.Scanner;/*** 汉诺塔* * author JayChang* */ public class HanoiResolve {/*** 移动位置* * param positionA* param positionB*/public static void move(String positionA, String positionB) {Syst…

数据结构——树和二叉树 6-1 求二叉树高度 (20 分)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

PTA 函数题 求二叉树高度(C语言)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

6-1 求二叉树高度

6-1 求二叉树高度 (15 分) 本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT );其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Rig…

二叉树的构造及求解二叉树高度

题目描述 1、参考题目解释构造一棵二叉树&#xff1b; 2、求解二叉树的高度 3、有余力同学尝试打印这棵二叉树&#xff08;以树的形态&#xff0c;非必须&#xff09; 输入 A(B(E,C(D(F(,G),),) 输出 二叉树高度为: 6 代码实现 #include <iostream> //#include &l…

二叉树4:二叉树求树高度(超级详细)

一、思路 什么是树高&#xff1f; 树的高度(或深度)就是树中结点的最大层数。 在这里使用后序遍历的递归算法。 对每一个结点都进行如下操作&#xff1a; 后序遍历其左子树求树高后序遍历其右子树求树高对这个结点进行下面操作&#xff1a; 比较其左右子树的高度大小若左&g…

二叉树的高度和深度

二叉树的高度和深度定义 &#xff08;对某个节点来说&#xff09; 深度是指从根节点到该节点的最长简单路径边的条数&#xff1b; 高度是指从最下面的叶子节点到该节点的最长简单路径边的条数&#xff1b; &#xff08;对二叉树&#xff09; 深度是从根节点数到它的叶节点&…

关于360提示发现木马—HEUR/QVM.Malware.Gen

今天用Visual Studio写的关于三层架构的程序 在启动运行时&#xff0c;弹出了360关于"检测到木马程序"的提示框&#xff1a; 虽然知道自己写的是正规程序&#xff0c;但初看时还是被吓了一跳&#xff0c;于是立马上网查阅相关资料和解答&#xff0c;结论是&#xff…

WebRTC 之 RTX

AbstractWebRTC RTX 笔记AuthorsWalter FanCategorylearning noteStatusv1.0Updated2020-08-28LicenseCC-BY-NC-ND 4.0 什么是 RTX RTX 就是重传 Retransmission, 将丢失的包重新由发送方传给接收方。 Webrtc 默认开启 RTX (重传)&#xff0c;它一般采用不同的 SSRC 进行传输&a…

红与蓝:现代Webshell检测引擎免杀对抗与实践

上半年Webshell话题很火,业界举办了数场对抗挑战赛,也发布了多篇站在安全产品侧,着重查杀思路的精彩文章,但鲜有看到以蓝军视角为主的paper。 作为多场挑战赛的参赛者及内部红蓝对抗的参与者,笔者试着站在蓝军角度,聊聊现代Webshell对抗的一些思路,也以PHP Webshell为例…

堪比熊猫烧香!中国新型蠕虫病毒大爆发!电脑瞬间报废

堪比熊猫烧香&#xff01;中国新型蠕虫病毒大爆发&#xff01;电脑瞬间报废 近日&#xff0c;深信服安全团队监测到一种名为incaseformat的病毒&#xff0c;全国各个区域都出现了被incaseformat病毒删除文件的用户。 经调查&#xff0c;该蠕虫正常情况下表现为文件夹蠕虫&#…

Dreh zelle acht hoch

Android6.0权限和SharedPreferences存储 static class MyTask extends AsyncTask<String,String,String> { Override protected String doInBackground(String... strings) { FileOutputStream outnull; InputStream inputStreamnull;//网络连接的输入流 HttpURLConnecti…

json.cp37-win32.pyd HEUR/QVM30.2.223F.Malware...

问题 使用pyinstaller导出exe,运行时候会被360杀毒报木马. 病毒类型是HEUR/QVM30.2.223F.Malware.Gen 木马文件是 pandas库下的一个文件 \Python\Python37-32\Lib\site-packages\pandas\_libs\json.cp37-win32.pyd 原因 32位的pandas文件是 json.cp37-win32.pyd (32位的,3…

Herm Chart

参考链接 https://blog.csdn.net/QianLiStudent/article/details/111872100 https://www.jianshu.com/p/4bd853a8068b 1 概念 1.1 Helm 1.1.1 Helm是什么&#xff1f; Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Pyt…

关于桌面程序被安全软件误判为HEUR:Trojan.Win32.Generic的解决方案

最近写了一个桌面程序&#xff0c;里面用了些读取系统环境变量、提取文件图标、启动外部程序之类的操作。 然后…………卡巴斯基就把它识别成了HEUR:Trojan.Win32.Generic………… 咱遵纪守法好程序&#xff0c;怎么说是木马就是木马了呢&#xff1f;&#xff1f;&#xff1f; …

从0到1学会使用SpringBoot 搭建mock Server

做过接口测试的同学一定听说过mock Server&#xff0c;大家会觉得其很神秘&#xff0c;很高大上&#xff01;mock Server出现的原因是现今的业务系统很少有孤立存在的&#xff0c;它们或多或少需要使用兄弟团队或是其他公司提供的服务&#xff0c;这给我们的联调和测试造成了麻…