【C语言】递归的经典问题(模拟strlen,阶乘,斐波那契数列,汉诺塔,青蛙跳台阶)

article/2025/9/18 0:13:46

以下我分享的是关于C语言递归的比较经典的题,有些题提供了多种解法,希望可以帮助你打开思路,如果你有更多的解法,欢迎评论区留言哟~

目录

一、输入1234,输出1 2 3 4

二、模拟strlen功能

1)递归

2)计数器

3)指针-指针

三、递归与迭代

1)求一个数的阶乘

1.递归

2.迭代

2)求斐波那契数列

1.递归

2.迭代

四、汉诺塔问题

五、青蛙跳台阶问题


一、输入1234,输出1 2 3 4

#include<stdio.h>
void my_print(int a){
if(a>9){my_print(a/10);
}
printf("%d ",a%10);
}
int main(){
int a=1234;
my_print(a);
return 0;
}

二、模拟strlen功能

1)递归

#include<stdio.h>
int my_strlen(char ch[]){
if(*ch=='\0')return 0;
else return 1+my_strlen(ch+1);
}
int main(){
char ch[]="abcdefg";
int sz=my_strlen(ch);
printf("%d",sz);
return 0;
}

2)计数器

#include<stdio.h>
int my_strlen(char ch[]){
int count=0;
while(*ch!='\0'){
count++;
ch++;
}
return count;
}
int main(){
char ch[]="abcdefg";
int len=my_strlen(ch);
printf("%d",len);
return 0;
}

3)指针-指针

两个指针相减的结果是它们之间元素的个数。

两个指针相减的前提条件是在同一个空间。

#include <stdio.h>
int my_strlen(char *ch) {char* start = ch;while (*ch != '\0') {ch++;}return ch - start;}
int main() {char ch[] = "abcdefg";int len = my_strlen(ch);printf("%d", len);return 0;
}

三、递归与迭代

1)求一个数的阶乘

1.递归

#include<stdio.h>
int jiecheng(int a){
if(a<2) return 1;
else return a*jiecheng(a-1);
}
int main(){
int a=0;
scanf("%d",&a);
int num=jiecheng(a);
printf("%d",num);
return 0;
}

2.迭代

#include<stdio.h>
int jiecheng(int a){
int i=1;
int num=1;
for(i=1;i<=a;i++){
num*=i;
}
return num;
}
int main(){
int a=0;
scanf("%d",&a);
int num=jiecheng(a);
printf("%d",num);
return 0;
}

2)求斐波那契数列

1.递归

#include<stdio.h>
int fib(int a){
if(a<3)return 1;
else return fib(a-1)+fib(a-2);
}
int main(){
int a=0;
scanf("%d",&a);
int num=fib(a);
printf("%d",num);
return 0;
}

2.迭代

#include<stdio.h>
int fib(int a){
int i=1;
int j=1;
int k=1;
while(a>2){
k=i+j;
i=j;
j=k;
a--;}
return k;
}
int main(){
int a=0;
scanf("%d",&a);
int num=fib(a);
printf("%d",num);
return 0;
}

四、汉诺塔问题

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

           

 解题思路

1.如果是一个盘,直接从A=>C

2.如果是两个盘,1)1个盘从A=>B

                            2)  另一个盘从A=>C

                            3)第一个盘从B=>C

3.如果是三个盘,1)1 A=>C

                            2)   2 A=>B

                            3)   1 C=>B

                            4)   3 A=>C

                            5)   1 B=>A

                            6)   2 B=>C

                            7)   1 A=>C

4.如果是n个盘,1)(n-1)个盘从A=>B(借助C)

                          2)  第n个盘从A=>C

                          3) (n-1)个盘从B=>C(借助A) 

#include <stdio.h>
void move(char a,char b,char c) {printf("%c=>%c\n",a,c);//a=>c
}
void hanoi(int n, char a, char b, char c) {if (n == 1)move(a, b, c);//a=>celse {hanoi(n - 1, a, c, b);//(n-1)个盘借助c从a移到bmove(a, b, c);//a=>chanoi(n - 1, b, a, c);//(n-1)个盘借助a从b移到c}
}
int main() {int num = 0;char a='a', b='b', c='c';printf("请输入盘子数:");scanf("%d", &num);hanoi(num, a, b, c);return 0;
}

五、青蛙跳台阶问题

青蛙跳台阶一次跳一阶或两阶,跳n个台阶有几种跳法???

解题思路

1)n=1 1种,跳1阶

2)n=2  2种

             1)两次一阶

             2)一次两阶 

3)n=3  3种

             1)一次一阶1)两次一阶

                                 2)一次两阶

             2)一次两阶3)一次一阶

#include<stdio.h>
int jump(int num) {if (num <3)return num;else return jump(num - 2) + jump(num - 1);
}
int main() {int num = 0;printf("请输入台阶数:");scanf("%d", &num);int n=jump(num);printf("%d", n);return 0;
}

 以上就是我今天关于C语言递归的分享,希望可以对你有所帮助,如果有什么建议欢迎评论区留言!!!


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

相关文章

7.递归-汉诺塔

汉诺塔问题&#xff1a; 如果求解的汉诺塔是3层&#xff0c;可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b&#xff0c;再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c&#xff0c;通过a为中介。 算法分析&#xff08;递归算法&#xff09; 我…

数据结构与算法之汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 一、汉诺塔问题 1.汉诺塔问题 起源&#xff1a;一位法国数学家曾编写过一个印度的古老传说&#xff1a;在世界中心贝拿勒斯的圣庙里&#xff0c;一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&#xff…

汉诺塔 最优算法设计商量

2019独角兽企业重金招聘Python工程师标准>>> 引言 汉诺塔算法一向是算法设计科目标最具代表性的研究题目&#xff0c;本文存眷于如何设计多柱汉诺塔最优算法的商量。最简单的汉诺塔是三个柱子&#xff08;A、B、C&#xff09;&#xff0c;是以多柱汉诺塔的柱子个数M…

函数递归与汉诺塔

C初阶之函数递归 函数递归基本原理 什么是递归&#xff1f;程序调用自身的编程技巧称为递归recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;…

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

分治算法就是分成若干个和原问题一样性质的子问题&#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…