2013-03-31 53 views
3

我想写一个for循环与数学9.因此,一个变量的上限,而不是对于循环变量上限

j = 0; 
    For[n = 1, n <= 3, n++, j = j + n]; 
    j 
    (*6*) 

我想做

N = 3; 
    j = 0; 
    For[n = 1, n <= N, n++, j = j + n]; 
    j 
    n 
    (* 
    0 
    1 
    *) 

。但是,如图所示,这并没有给出正确的结果;从n的值看来,循环的主体根本没有被评估。

我已经通过Mathematica文档了解了for循环以及更一般的循环和控制结构(并且还完成了一些DuckDuckGo搜索),但仍然存在一些我缺少的基础知识。它是什么?

为了完整起见,我要指出,我的最终目标是把这个函数:

foo[N] = 
Module[{j = 0}, 
    For[n = 1, n <= N, n++, j = j + n;]; 
    j] 
foo[3] 

回答

0

你的代码演示了几种常见的新用户的问题。例如:

  • N是保留字
  • 你不应该用大写字母
  • 功能foo[]启动标识应与SetDelayed定义(:=),并设置为不 (=
  • 您需要在函数定义的参数使用模式(_
  • For[]循环和迭代一般小号HOULD在 避免数学

我想你可以仔细阅读所有的答案this post获得数学上更好的抓地力。

无论如何,你的代码可能会被改写为

foo[k_] := Module[{j = 0}, For[n = 1, n <= k, n++, j = j + n]; j] 
foo[3] 
(*6*) 

但是,这是可怕的数学编码。
以下是数学中的更好的方法:

foo[j_ , k_] := Fold[Plus, j, [email protected]] 
foo[j_ , k_] := j + [email protected]@k 
foo[j_ , k_] := j + [email protected]@k 
+0

N是保留是我最直接的问题的事实。不过谢谢您指出其他问题,特别感谢您指点我的新手问题问题:我需要一段时间来消化这个问题,但看起来真的很有帮助。另外,您是否熟悉Mathematica与Scheme或Haskell的良好对比?假装它的Matlab显然不能很好地工作,但假装它是Lisp并不总是工作。 –

+0

@ChristopherWhite不要让语法糖误导你。 Mathematica是一种功能性的术语重写语言。有一些结构只携带副作用来缓解一些复杂的操作,但通常可以避免。你不应该在Mathematica中使用循环,除了**真的**特殊情况。 –