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
相关产品推荐
相关产品推荐

