Menu
CoddyTech

递归函数:倒计时

本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 48 课,共 65 课。

现在该用一个简单的倒计时函数来练习递归了。这个练习会帮助你理解基本情况和递归步骤如何在实际代码中协同工作。

倒计时函数从一个数字开始,并依次打印数字,直到零。递归通过以下方式实现这一点:如果数字大于零,就打印它,然后用一个更小的数字调用同一个函数。数字达到零时,停止。

void countdown(int number) {
  if (number <= 0) {
    print("Done!");
    return; // 递归终止条件:在这里停止
  }
  
  print(number);
  countdown(number - 1); // 递归步骤
}

基本情况会检查 number <= 0,满足时我们就停止调用函数。递归步骤会调用 countdown(number - 1),这仍然是同一个问题,但输入更小,会逐步接近基本情况。

调用 countdown(3) 时,它会打印 3,然后调用 countdown(2),打印 2,然后调用 countdown(1),打印 1,然后调用 countdown(0),打印 "Done!" 并停止。

challenge icon

挑战

简单

创建一个程序,实现带自定义消息的递归倒计时。你的程序将从给定的数字开始倒计时,并在每一步显示个性化消息,以此演示递归。

  1. 读取一个字符串输入,表示倒计时的起始数字
  2. 读取一个字符串输入,表示自定义消息前缀(例如,"Launch in"、"Timer" 或 "Countdown")
  3. 使用 int.parse() 将第一个输入转换为整数
  4. 创建一个名为 customCountdown 的递归函数,该函数接受两个参数:
    • 一个整数 number,表示当前倒计时的值
    • 一个字符串 messagePrefix,用于自定义消息
  5. 函数应实现以下逻辑:
    • 基本情况:如果数字小于或等于 0,则打印 "Countdown complete!" 并返回
    • 递归步骤:打印消息前缀和当前数字,然后使用 number - 1 调用自身
  6. 使用转换后的数字和消息前缀调用 customCountdown 函数
  7. 按照下方所示的确切格式显示结果

例如,如果输入是 "5" 和 "Launch in",程序应输出:

Starting countdown from: 5
Message prefix: Launch in
========================
Launch in 5
Launch in 4
Launch in 3
Launch in 2
Launch in 1
Countdown complete!

如果输入是 "3" 和 "Timer",程序应输出:

Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!

如果输入是 "0" 和 "Ready",程序应输出:

Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!

你的程序必须实现递归函数 customCountdown,并让它使用递减后的数字调用自身,直到达到基本情况。函数应在每次递归调用时,打印包含当前数字的自定义消息,以此演示递归如何将问题拆分为更小的相同子问题。使用字符串插值,将倒计时消息格式化为 "$messagePrefix $number"。

亲手试试

import 'dart:io';

// TODO:在这里创建你的 customCountdown 函数
// 记得处理递归的基本情况(number <= 0)和递归步骤

void main() {
  // 读取输入
  String? startingNumber = stdin.readLineSync();
  String? messagePrefix = stdin.readLineSync();
  
  // 将字符串转换为整数
  int number = int.parse(startingNumber!);
  
  // 显示初始信息
  print('Starting countdown from: $number');
  print('Message prefix: $messagePrefix');
  print('========================');
  
  // TODO:在这里调用你的 customCountdown 函数
  // 记得处理 messagePrefix 的空值安全
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程控制中的所有课

自己练习: Dart 在线编译器