You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何为斐波那契递归函数设置可选位置参数

问题:如何简化斐波那契递归函数的调用,无需传入空Map?

我正在学习递归,编写了以下用于计算斐波那契数列第N项的方法:

fibonacci(int n, Map memo) {

  if (memo.containsKey(n)) return memo[n];  // Memo check
  if (n <= 2) return 1;  // base case
  // calculation
  memo[n] = fibonacci(n - 1, memo) + fibonacci((n - 2), memo);
  return memo[n];
}

目前我需要这样调用该函数:

fibonacci(n, {});

但我希望能简化成如下调用方式:

fibonacci(n);

解决方案

方法1:给参数设置默认值(推荐,适用于支持可选参数的语言如Dart)

修改函数定义,将memo设为可选参数,并在函数内部初始化空Map(避免默认参数为不可变常量的问题):

fibonacci(int n, [Map? memo]) {
  // 如果memo未传入,初始化空Map
  memo ??= {};
  
  if (memo.containsKey(n)) return memo[n];
  if (n <= 2) return 1;
  memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
  return memo[n];
}

这样就可以直接用fibonacci(n)调用,未传入的memo会自动初始化为空Map。

方法2:编写重载函数

如果你的语言支持函数重载,可以新增一个仅接收n的函数版本,内部创建空Map调用原函数:

// 重载版本,供外部调用
fibonacci(int n) {
  return fibonacci(n, {});
}

// 原带memo的函数
fibonacci(int n, Map memo) {
  if (memo.containsKey(n)) return memo[n];
  if (n <= 2) return 1;
  memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
  return memo[n];
}

方法3:使用包装函数

如果不想修改原函数,可以单独写一个包装函数来封装调用逻辑:

// 包装函数
int fibWrapper(int n) {
  return fibonacci(n, {});
}

之后调用fibWrapper(n)即可达到简化效果。


内容的提问来源于stack exchange,提问作者Peppinhood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 08:45:33