此等式是否适用于所有序列f[n]
?
f[n_] := Module[{x = intial value, y = 0, i = 0},
While[i++ < n, {x, y} = {y, equation}]; y]
具体来说,我正在查看具有初始条件6*n*f[n]=f[n-1]+n!
的等式f[0] = 7
。但是,我想要一般的解决方案,以便我可以将它应用于其他方程式。而且,我想使用Module
和While
。
答案 0 :(得分:7)
实现重复序列的最简洁和最常见的方法是使用memoization定义f
,“记住”因为效率而计算的术语:
f[0] = 7
f[n_Integer?Positive] := f[n] = (f[n - 1] + n!)/(6 n)
然后:
In[29]:= Table[f[n], {n, 0, 6}]
Out[29]= {7, 4/3, 5/18, 113/324, 7889/7776, 941009/233280, 168902609/8398080}
如果您不需要自行编制重复计划,也可以使用RecurrenceTable
直接生成字词,而无需定义f
:
In[30]:= RecurrenceTable[{a[0] == 7, 6 n a[n] == a[n - 1] + n!}, a, {n, 6}]
Out[30]= {7, 4/3, 5/18, 113/324, 7889/7776, 941009/233280, 168902609/8398080}
答案 1 :(得分:1)
所以你想要计算序列:
f(n) = (f(n-1) + n!) / (6 * n)
实现它的一种方法是:
f[n_] := Module[{values},
values = Table[0, {n}];
values[[1]] = 7;
Do[values[[i]] = (values[[i-1]] + (i-1)!) / (6 * (i-1)), {i, 2, n}]
values];
或等效地:
f[n_] := Module[{values, i = 2},
values = Table[0, {n}];
values[[1]] = 7;
While[i <= n, values[[i]] = (values[[i-1]] + (i-1)!) / (6 * (i-1)); i++];
values];
虽然有更有效的方法。
我忘记了Bock和Module的差异,但它们非常相似。