以下我分享的是关于C语言递归的比较经典的题,有些题提供了多种解法,希望可以帮助你打开思路,如果你有更多的解法,欢迎评论区留言哟~
目录
一、输入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语言递归的分享,希望可以对你有所帮助,如果有什么建议欢迎评论区留言!!!