新闻中心

EEPW首页 > 设计应用 > 实例讲解|彻底弄懂C语言递归

实例讲解|彻底弄懂C语言递归

作者: 时间:2025-03-11 来源: 收藏

1. 汉诺塔:

本文引用地址:https://www.eepw.com.cn/article/202503/467918.htm

请输入盘子数,输出盘子移动的操作步骤。

#include
void move(char fromchar to) {
   printf("%c to %cn"fromto);
}
void hanoi(int nchar achar bchar c) {
   if (n == 1)
       move(ac);
   else {
       hanoi(n - 1acb);
       move(ac);
       hanoi(n - 1bac);
  }
}
void main() {
   int n;
   scanf("%d"&n);
   hanoi(n'A''B''C');
}

2. 爬楼梯:

树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。

#include
intstair(intn) {
if (n==1return1;
if (n==2return2;
returnstair(n-1+stair(n-2);
}
voidmain() {
intn;
scanf("%d"&n);
printf("%d"stair(n));
}

3. 爬楼梯:

树老师爬楼梯,他可以每次走1级、2级或者3级,输入楼梯的级数,求不同的走法数。

#include
intstair(intn) {
if (n==1return1;
if (n==2return2;
if (n==3return4;
returnstair(n-1+stair(n-2+stair(n-3);
}
voidmain() {
intn;
scanf("%d"&n);
   printf("%d"stair(n));
}

4. 斐波那契数列:

请输入项数,输出具体数列。

#include
int fibonacci(int n) {
   if (n == 1 || n == 2)
       return 1;
   return fibonacci(n - 1+ fibonacci(n - 2);
}
void main() {
   int ni;
   scanf("%d"&n);
   for (i = 1i <= ni++)
       printf("%d,"fibonacci(i));
}

5. 求阶乘:

请输入整数n,求1!+2!+3!+4!+5!+6!+7!+…+n!的和。

#include
int factorial(int n) {
   if (n == 1return 1;
   return n * factorial(n - 1);
}
void main() {
   int nisum = 0;
   scanf("%d"&n);
   for (i = 1i <= ni++)
       sum += factorial(i);
   printf("sum=%d"sum);
}

6. 取球问题:

在n个球中,任意取m个(不放回),求有多少种不同取法。

#include
int ball(int nint m) {
   if (n < m)  return 0;
   if (n == mreturn 1;
   if (m == 0return 1;
   return ball(n - 1m - 1+ ball(n - 1m);
}
void main() {
   int nm;
   scanf("%d%d"&n&m);
   printf("%d"ball(nm));
}

7. 杨辉三角:

输入要打印的层数,打印杨辉三角。

#include
int triangle(int mint n) {
   if (m == 0 || n == 0 || m == n)
       return 1;
   return triangle(m - 1n+ triangle(m - 1n - 1);
}
void main() {
   int nij;
   scanf("%d"&n);
   for (i = 0i < ni++) {
       for (j = 0j <= ij++) {
           printf("%d "triangle(ij));
      }
       printf("n");
  }
}

8. 求年龄:

有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?

#include
int age(int n) {
   if (n == 1return 10;
   return age(n - 1+ 2;
}
void main() {
   printf("%d"age(5));
}

9. 猴子吃桃问题:

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第十天早上想再吃时,见只剩下一个桃子了。问最初有多少个桃子。

#include
int peach(int n) {
   if (n == 10return 1;
   return (peach(n + 1+ 1* 2;
}
void main() {
   printf("%d"peach(1));
}

循环:

#include
void main() {
   int is = 1;
   for (i = 9i >= 1i--) {
       s = (s + 1* 2;
  }
   printf("%d"s);
}

10. 猴子吃桃问题:

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。第十天同样是吃了前一天的一半加一个,最后剩下一个桃子。问最初有多少个桃子。

#include
int peach(int n) {
   if (n == 11return 1;
   return (peach(n + 1+ 1* 2;
}
void main() {
   printf("%d"peach(1));
}

循环:

#include
void main() {
   int is = 1;
   for (i = 10i >= 1i--) {
       s = (s + 1* 2;
  }
   printf("%d"s);
}

11. 最大公约数:

利用算法求两个数的最大公约数。

#include
/* 最大公约数 */
int gcd(int aint b) {
   int t;
   if (a < b) {
       t = a;
       a = b;
       b = t;
  }
   if (b == 0) {
       return a;
  }
   return gcd(ba % b);
}
void main() {
   int ab;
   scanf("%d%d"&a&b);
   printf("gcd=%d"gcd(ab));
}

12. 逆序输出:

输入一个正整数,将该正整数逆序输出。

#include
void printDigit(int n) {
   printf("%d"n % 10);
   if (n > 10) {
       printDigit(n / 10);
  }
}
void main() {
   int n;
   scanf("%d"&n);
   printDigit(n);
}

13. 逆序输出:

输入一个字符串,将该字符串逆序输出。

#include
void printStr(char *str) {
   if (*str != '�')
       printStr(str + 1);
   if (*str != '�')
       printf("%c"*str);
}
void main() {
   char str[100];
   gets(str);
   printStr(str);
}


关键词: C语言 递归

评论


相关推荐

技术专区

关闭