2011-04-05 63 views
0

此方程適用於所有序列f[n]Mathematica幫助While和模塊命令

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。但是,我希望解決方案具有一般性,以便我可以將其應用於其他方程。而且,我想使用ModuleWhile

謝謝。

+1

是的,它的確如此。我的意思不是,絕對不是。那就是說,你在問什麼?我無法用我認識的任何編程語言(包括Mathematica,至少在美好的一天)理解上述內容。在minumun:什麼是'方程',並且保證是一個非負值? – 2011-04-05 01:41:28

+1

當然可以。從邏輯上講,實際上沒有什麼問題。我會保證,它不會做你想要的。 – 2011-04-05 01:48:26

+0

@丹尼爾我的意思是'公式'在某種程度上和是> n> 0 – Sunday 2011-04-05 01:52:42

回答

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的區別,但它們非常相似。

+0

Buh我試圖使用模塊,而命令導致他們需要更少的時間來計算 – Sunday 2011-04-05 02:34:04

+0

@Sunday:循環通常比While和For循環快。檢查我的答案爲等效的循環。 – 2011-04-05 02:37:46

+0

Shudnt的輸出是這個,而urs給出了這兩個公式給出了別的東西{4/3,5/18,113/324,7889/7776,941009/233280,168902609/8398080,\ 42495225809/352719360,14264139821009/16930529280,\ 6158014604947409/914248581120,3323783265773203409/54854914867200} – Sunday 2011-04-05 02:44:16

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}