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

如何捕获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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:05:19