递归函数:阶乘
本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 49 课,共 65 课。
一个数的阶乘是一种经典的数学运算,非常适合用来演示递归。正整数 n 的阶乘(写作 n!)是从 1 到 n 的所有正整数的乘积。例如,5! = 5 × 4 × 3 × 2 × 1 = 120。
阶乘非常适合用递归来实现,因为它会自然地分解成更小的相同问题。要计算 5!,你可以把它看作 5 × 4!。而 4! 就是 4 × 3!,以此类推。这个模式会一直延续,直到 1!,它等于 1。
int factorial(int n) {
if (n <= 1) {
return 1; // 递归终止条件
}
return n * factorial(n - 1); // 递归步骤
}当 n <= 1 时,基本情况会停止递归,并返回 1。递归步骤会将当前数字乘以小一个数字的阶乘。调用 factorial(5) 时,它会返回 5 * factorial(4),后者会返回 5 * 4 * factorial(3),依此类推,直到到达基本情况。
这种方法展示了递归如何通过将问题逐步简化为同一问题的更简单版本,优雅地解决问题,让复杂的计算变得自然直观。
挑战
简单创建一个程序,使用递归计算多个数字的阶乘。你的程序将通过处理一个数字列表并计算其中各个数字的阶乘,展示递归阶乘函数。
- 读取一个字符串输入,其中包含以逗号分隔的数字(例如,
"3,5,0,7") - 将输入字符串拆分为单个数字,并将每个数字转换为整数
- 创建一个名为
factorial的递归函数,该函数接受一个整数参数n factorial函数应实现以下逻辑:- 基本情况:如果
n小于或等于 1,则返回 1 - 递归步骤:返回
n乘以factorial(n - 1) - 对于输入列表中的每个数字,使用递归函数计算它的阶乘
- 显示结果,列出每个数字及其对应的阶乘
- 计算并显示所有阶乘结果的总和
例如,如果输入是 "4,3,2",你的程序应输出:
Factorial Calculator
====================
Processing numbers: [4, 3, 2]
====================
Factorial Results:
4! = 24
3! = 6
2! = 2
====================
Sum of all factorials: 32
Calculation completed successfully如果输入是 "5,0,1",你的程序应输出:
Factorial Calculator
====================
Processing numbers: [5, 0, 1]
====================
Factorial Results:
5! = 120
0! = 1
1! = 1
====================
Sum of all factorials: 122
Calculation completed successfully如果输入是 "6",你的程序应输出:
Factorial Calculator
====================
Processing numbers: [6]
====================
Factorial Results:
6! = 720
====================
Sum of all factorials: 720
Calculation completed successfully你的程序必须实现递归 factorial 函数,并让它不断使用递减后的值调用自身,直到达到基本情况。该函数应展示递归如何将阶乘计算分解为更小的相同子问题。使用字符串插值,将阶乘结果格式化为 "$n! = $result"。请记住,根据数学定义,0! 等于 1,你的基本情况应正确处理这一点。
亲手试试
import 'dart:io';
// TODO: 在这里创建你的递归阶乘函数
void main() {
// 读取包含以逗号分隔的数字的输入字符串
String? input = stdin.readLineSync();
// 拆分输入并转换为整数
List<int> numbers = input!.split(',').map((str) => int.parse(str.trim())).toList();
// TODO: 在下方编写代码,完成以下任务:
// 1. 用你的阶乘函数处理每个数字
// 2. 计算所有阶乘的和
// 3. 按要求的格式显示结果
print("Factorial Calculator");
print("====================");
print("Processing numbers: $numbers");
print("====================");
print("Factorial Results:");
// TODO: 在这里计算并显示阶乘结果
print("====================");
// TODO: 显示所有阶乘的和
print("Calculation completed successfully");
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程控制中的所有课
自己练习: Dart 在线编译器