如何捕获getFactorial函数的传入值并在print函数中使用?
解决方法
你的代码问题在于递归调用getFactorial时,会不断覆盖实例变量p1的值,最后p1会变成1,而非最初传入的8。这里提供几种可行的解决方式:
方式一:直接保存传入的参数(最简单)
不需要依赖类的属性,直接在调用前把初始值存到变量里:
void main() { Factorial fac = Factorial(); final targetNum = 8; // 直接保存初始传入的数值 fac.getFactorial(targetNum); print(targetNum); // 直接使用这个变量 } class Factorial { int getFactorial(int n) { if (n == 1) { return 1; } return n * getFactorial(n - 1); } }
方式二:拆分方法,单独保存初始值
把递归逻辑和初始值保存分开,避免递归覆盖:
void main() { Factorial fac = Factorial(); fac.calculateFactorial(8); print(fac.initialNum); } class Factorial { int? initialNum; // 对外的方法,负责保存初始值并启动递归 int calculateFactorial(int n) { initialNum = n; return _getFactorial(n); } // 私有递归方法,只处理阶乘计算 int _getFactorial(int n) { if (n == 1) { return 1; } return n * _getFactorial(n - 1); } }
方式三:用可选参数标记初始调用
在递归方法里通过可选参数判断是否是第一次调用,只在第一次时保存初始值:
void main() { Factorial fac = Factorial(); fac.getFactorial(8); print(fac.initialNum); } class Factorial { int? initialNum; int getFactorial(int n, {bool isInitial = true}) { // 只有第一次调用时保存初始值 if (isInitial) { initialNum = n; } if (n == 1) { return 1; } // 递归调用时标记为非初始调用 return n * getFactorial(n - 1, isInitial: false); } }
内容的提问来源于stack exchange,提问作者Jahangir Alam
相关产品推荐
相关产品推荐

