对于具有可变上限的循环

时间:2013-03-31 20:54:47

标签: variables for-loop wolfram-mathematica

我想在Mathematica 9中编写一个带有可变上限的for循环。所以,而不是

  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]

1 个答案:

答案 0 :(得分:0)

您的代码显示了几个常见的新用户问题。例如:

  • N是保留字
  • 您不应该使用大写字母
  • 来启动标识符
  • 函数foo[]应使用SetDelayed(:=)定义,而不是 使用Set(=
  • 您需要在函数定义参数
  • 中使用模式(_
  • For[]循环,一般应避免迭代 数学

我认为你可以仔细阅读this post的所有答案,以更好地掌握Mathematica。

无论如何,您的代码可能会被重写为

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

但这是可怕的Mathematica编码 以下是Mathematica中更好的方法:

foo[j_ , k_] := Fold[Plus, j, Range@k]
foo[j_ , k_] := j + Total@Range@k
foo[j_ , k_] := j + Tr@Range@k