2011-04-05 61 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}