这些题目助你学习C语言递归调用

科技   2024-09-13 13:01   北京  

扫描关注一起学嵌入式,一起学习,一起成长


1.汉诺塔:请输入盘子数,输出盘子移动的操作步骤。

#include <stdio.h>

void move(char fromchar to) {
   printf("%c to %c\n"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 <stdio.h>

int stair(int n) {
   if (n == 1return 1;
   if (n == 2return 2;
   return stair(n - 1+ stair(n - 2);
}

void main() {
   int n;
   scanf("%d"&n);
   printf("%d"stair(n));
}

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

#include <stdio.h>

int stair(int n) {
   if (n == 1return 1;
   if (n == 2return 2;
   if (n == 3return 4;
   return stair(n - 1+ stair(n - 2+ stair(n - 3);
}

void main() {
   int n;
   scanf("%d"&n);
   printf("%d"stair(n));
}

4.斐波那契数列:请输入项数,输出具体数列。

#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

int age(int n) {
   if (n == 1return 10;
   return age(n - 1+ 2;
}

void main() {
   printf("%d"age(5));
}

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

递归:

#include <stdio.h>

int peach(int n) {
   if (n == 10return 1;
   return (peach(n + 1+ 1* 2;
}

void main() {
   printf("%d"peach(1));
}

循环:

#include <stdio.h>

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

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

递归:

#include <stdio.h>

int peach(int n) {
   if (n == 11return 1;
   return (peach(n + 1+ 1* 2;
}

void main() {
   printf("%d"peach(1));
}

循环:

#include <stdio.h>

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

11.最大公约数:利用递归算法求两个数的最大公约数。

#include <stdio.h>

/* 最大公约数 */
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 <stdio.h>

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 <stdio.h>

void printStr(char *str) {
   if (*str != '\0')
       printStr(str + 1);
   if (*str != '\0')
       printf("%c"*str);
}

void main() {
   char str[100];
   gets(str);
   printStr(str);
}

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。



关注【一起学嵌入式】,回复加群进技术交流群。




觉得文章不错,点击“分享”、“”、“在看” 呗

一起学嵌入式
结伴而行,RTOS、Linux编程、C/C++,以及经验分享、行业资讯、物联网等技术知识。一起学习,一起成长
 最新文章