所以这是我改变的问题:
答案 0 :(得分:2)
首先,我会重写你的函数,找到更简单的阶乘
function n = factorial(n)
n = prod(1:n);
end
你的问题中的循环是不必要的,因为你从不使用循环变量i
。我不会对我的解决方案使用此函数,因为它可能非常慢,因为您必须在每次循环迭代时计算冗余信息。
如果您仍想使用for
循环,则需要将其重写为
function f = factorial(n)
f = 1; % 0 factorial
for i = 1:n
f = f * i;
end
end
您可以使用自然对数和log
s的规则来确定可以与之比较的e
的非常准确的值。您可以检查e
的值由x^(1 / log(x))
给出,其中x
可以是1
以外的任何正实数,例如2
。我们可以在
现在我们如何检查我们是否计算了e
到10位小数精度的值。鉴于上面的b
是e
的非常准确的表示,我们可以与之进行比较,以确定我们何时达到了准确的解决方案
x = 2; % Any positive number other than 1
c = x^(1 / log(x));
...
if (abs(e - c) < 1e-10)
break;
end
在我的解决方案e
中,我用无限和计算了近似值。 注意:当e - c
为负数时,采用绝对值来防止误报。
现在,一种计算无限和的有效方法。我们可以利用如何计算阶乘以在每次迭代期间不必计算它,从而大大提高效率。首先,在我的情况下,我们需要一个和变量e
来跟踪我们的近似解。然后我们需要另一个变量来跟踪我的情况中的阶乘f
。由于0
是一个有趣的案例,我们将从它开始
e = 0;
f = 1; % 0 factorial
e = e + 1 / f;
现在我们拥有无限和的第一个元素。接下来,我们可以使用无限和来计算更准确的e
近似值。可以在每次迭代期间更新阶乘,f = f * n;
导致
for n = 1:inf
f = f * n; % Compute new factorial
e = e + 1 / f; % Infinite sum
...
end
现在把它完全放在
x = 2; % Any positive number other than 1
c = x^(1 / log(x));
e = 0;
f = 1; % 0 factorial
e = e + 1 / f;
for n = 1:inf
f = f * n; % Compute new factorial
e = e + 1 / f; % Infinite sum
if (abs(e - c) < 1e-10)
break;
end
end