打印
[牛人杂谈]

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

[复制链接]
342|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
豌豆爹|  楼主 | 2024-11-20 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.汉诺塔:请输入盘子数,输出盘子移动的操作步骤。#include <stdio.h>

void move(char from, char to) {
   printf("%c to %c\n", from, to);
}

void hanoi(int n, char a, char b, char c) {
   if (n == 1)
       move(a, c);
   else {
       hanoi(n - 1, a, c, b);
       move(a, c);
       hanoi(n - 1, b, a, c);
  }
}

void main() {
   int n;
   scanf("%d", &n);
   hanoi(n, 'A', 'B', 'C');
}2.爬楼梯:树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。#include <stdio.h>

int stair(int n) {
   if (n == 1) return 1;
   if (n == 2) return 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 == 1) return 1;
   if (n == 2) return 2;
   if (n == 3) return 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 n, i;
   scanf("%d", &n);
   for (i = 1; i <= n; i++)
       printf("%d,", fibonacci(i));
}

使用特权

评论回复
沙发
豌豆爹|  楼主 | 2024-11-20 14:56 | 只看该作者
5.求阶乘:请输入整数n,求1!+2!+3!+4!+5!+6!+7!+…+n!的和。#include <stdio.h>

int factorial(int n) {
   if (n == 1) return 1;
   return n * factorial(n - 1);
}

void main() {
   int n, i, sum = 0;
   scanf("%d", &n);
   for (i = 1; i <= n; i++)
       sum += factorial(i);
   printf("sum=%d", sum);
}6.取球问题:在n个球中,任意取m个(不放回),求有多少种不同取法。#include <stdio.h>

int ball(int n, int m) {
   if (n < m)  return 0;
   if (n == m) return 1;
   if (m == 0) return 1;
   return ball(n - 1, m - 1) + ball(n - 1, m);
}

void main() {
   int n, m;
   scanf("%d%d", &n, &m);
   printf("%d", ball(n, m));
}7.杨辉三角:输入要打印的层数,打印杨辉三角。#include <stdio.h>

int triangle(int m, int n) {
   if (m == 0 || n == 0 || m == n)
       return 1;
   return triangle(m - 1, n) + triangle(m - 1, n - 1);
}

void main() {
   int n, i, j;
   scanf("%d", &n);
   for (i = 0; i < n; i++) {
       for (j = 0; j <= i; j++) {
           printf("%d ", triangle(i, j));
      }
       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 == 1) return 10;
   return age(n - 1) + 2;
}

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

使用特权

评论回复
板凳
豌豆爹|  楼主 | 2024-11-20 14:56 | 只看该作者
9.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第十天早上想再吃时,见只剩下一个桃子了。问最初有多少个桃子。递归:#include <stdio.h>

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

void main() {
   printf("%d", peach(1));
}循环:#include <stdio.h>

void main() {
   int i, s = 1;
   for (i = 9; i >= 1; i--) {
       s = (s + 1) * 2;
  }
   printf("%d", s);
}10.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。第十天同样是吃了前一天的一半加一个,最后剩下一个桃子。问最初有多少个桃子。递归:#include <stdio.h>

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

void main() {
   printf("%d", peach(1));
}循环:#include <stdio.h>

void main() {
   int i, s = 1;
   for (i = 10; i >= 1; i--) {
       s = (s + 1) * 2;
  }
   printf("%d", s);
}11.最大公约数:利用递归算法求两个数的最大公约数。#include <stdio.h>

/* 最大公约数 */
int gcd(int a, int b) {
   int t;
   if (a < b) {
       t = a;
       a = b;
       b = t;
  }
   if (b == 0) {
       return a;
  }
   return gcd(b, a % b);
}

void main() {
   int a, b;
   scanf("%d%d", &a, &b);
   printf("gcd=%d", gcd(a, b));
}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);
}文章来源于网络,版权归原作者所有,如有侵权,请联系删除。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

513

主题

1978

帖子

5

粉丝