变式 4:选课有几种选法(阶乘拼组合数)
n 门选修课里选 m 门,有多少种选法?公式是: C(n, m) = n! / (m! × (n-m)!) 上面已经写好了递归的 fact。输入 n 和 m(0 ≤ m ≤ n ≤ 20),输出选法数。例如输入 4 2,应该输出 6,现在却
二级 · 程序填空:四个数里的最大值
下面的程序输出 9。请在【】处填入正确的内容。 #include <stdio.h> int max2(int a, int b) { return a > b ? a : b; } int max4(int
二级 · 选择:fun(9) 的值
有以下程序,运行后的输出结果是【0】。 #include <stdio.h> int fun(int x) { int p; if (x == 0 || x == 1) return 3;
二级 · 只写 fun:调用 sq 求平方和
上面已经给了函数 sq(x),返回 x 的平方。函数 fun(n) 的功能:调用 sq,返回 1² + 2² + … + n²。例如输入 4,输出: 30 不要改 main 和 sq,只在 fun 的大括号里编写代码。
作品:递归叠易拉罐金字塔
宿舍聚会用易拉罐叠金字塔:一共 n 层,第 i 层(从上往下数)有 2i−1 罐,前面用 . 补齐,让塔居中。函数 build(i, n) 打印第 i 层,然后递归去打下一层,第 n 层打完就停。 例如输入 4: ...o ..ooo .o
斐波那契递归:一个调用分两叉
fib(4) 的调用:每次分成两个更小的调用 f(4) f(3) f(2) f(2) f(1) f(2) 又算了一遍 斐波那契数列 1, 1, 2, 3, 5, 8……从第 3 项起,每项是前两项之和。② 里用循环算过,用递归写更像定义本身
递归版辗转相除
② 里用 while 循环做过辗转相除。写成递归只要两句: 结束条件:b == 0 时,最大公约数就是 a; 递推关系:gcd(a, b) = gcd(b, a % b)。 输入两个正整数,输出它们的最大公约数。例如输入 12 18,应该输
母题:汉诺塔怎么移
三根柱子 A、B、C,A 上有 n 个盘子,大的在下。每次移一个,大盘不能压小盘,要全部移到 C。递归的想法: 把上面 n−1 个从 A 借助 C 移到 B; 把最大的那个从 A 移到 C; 把 B 上的 n−1 个借助 A 移到 C。 h
变式 1:汉诺塔只数步数
不打印步骤,只算 n 个盘子一共要移几步。照母题的三步:两次「移 n−1 个」,加上中间那 1 步。输入 n(1 ≤ n ≤ 40),用 long long 输出。例如输入 3,输出: 7
变式 2:宿舍楼梯有几种走法
宿舍楼梯 n 级,每步走 1 级或 2 级,一共有几种走法? 想最后一步:要么从第 n−1 级走 1 级上来,要么从第 n−2 级走 2 级上来,所以 f(n) = f(n-1) + f(n-2)。1 级只有 1 种走法,2 级有 2 种(