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

以下我分享的是关于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=>c
	else {
		hanoi(n - 1, a, c, b);//(n-1)个盘借助c从a移到b
		move(a, b, c);//a=>c
		hanoi(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语言递归的分享,希望可以对你有所帮助,如果有什么建议欢迎评论区留言!!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值