【问题标题】:Understanding why my for loop does not work to approximate e了解为什么我的 for 循环无法近似 e
【发布时间】:2018-03-12 18:16:41
【问题描述】:

e 可以使用公式 e = 1 + (1/1!) + (1/2!) + (1/3!)... + (1/n!) 来近似。我正在尝试使用 for 循环来接受用户将 n 设置为的任何整数。程序应该使用上面的公式从 (1/1!) + .... (1/n!) 逼近 e 并输出结果。

嵌套的 for 循环计算 n 的阶乘(单独对其进行测试并且有效),并且定义的变量 frac 将阶乘放入 1/(对阶乘的答案)的分数。我将值存储到变量 e 中,每次迭代完成时它都应该将新分数添加到旧值中。我无法理解我的循环有什么问题,他们没有给出正确的答案。

System.out.println("Enter an integer to show the result of 
approximating e using n number of terms.");
int n=scan.nextInt();
double e=1;
double result=1;
for(int i=1; n>=i; n=(n-1))
{
    for(int l=1; l<=n; l++)
            {
                result=result*l;
            }
    double frac=(1/result);
    e=e+frac;
}
System.out.println(e);

当我输入整数 7 时输出 n = 1.0001986906956286

【问题讨论】:

  • 这不是javascript
  • 不是你计算阶乘的方式。当 i = 3 时,“结果”最终为 1 * 1 * 2 * 1 * 2 * 3 = 12,因为在 i 的每次迭代后您不会重置为 1。参考this question

标签: java for-loop nested-loops eulers-number


【解决方案1】:

您不需要整个内部循环。您只需要result *= i

for (int i = 1; i <= n; i++)
{
    result *= i;
    double frac = (1 / result);
    e += frac;
}

这是我刚刚汇总的 JavaScript 版本:

function init() {
  const elem = document.getElementById('eapprox');

  let eapprox = 1;
  const n = 15;
  let frac = 1;

  for (var i = 1; i <= n; ++i) {
    frac /= i;
    eapprox += frac;
  }

  elem.textContent = eapprox;
}

这产生 2.718281828458995。戳这里:http://plnkr.co/edit/OgXbr36dKce21urHH1Ge?p=preview

【讨论】:

  • 是的,Java(还有 JavaScript,还有 C 和一堆语言)有速记运算符 +=、-=、*=、/= 用于对变量进行加减乘除和将结果放回该变量中。
  • 在尝试准确了解您的 java 代码在做什么之后,我有点困惑。对于您给我的第一个答案,我使用 n 作为用户输入的任何输入,因此如果他们输入 n 为 7 (代码应输出 e = 1 + (1/7!) + (1/6!) + 。 ..(1/1!),如果你用 n 向上计数,for 循环如何停止?i(1) 不会总是小于或等于 n(7),因为 n 每次迭代都向上计数 1 ? 我不明白为什么这不是一个无限循环。我非常感谢这方面的帮助,在本学期之前从未用任何语言编写过代码!
  • 它没有意义的原因是我打错了:) 你是对的,它会一直持续下去。我在编写 JavaScript 版本时甚至没有意识到错字。
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多