3

我想在 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,循环体根本没有被评估。

我已经查看了有关 for 循环和更一般的循环和控制结构的 Mathematica 文档(并且还进行了一些 DuckDuckGo 搜索),但我仍然缺少一些基本的东西。它是什么?

为了完整起见,我应该注意我的最终目标是将它放在一个函数中:

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

1 回答 1

0

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

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

我认为您可以仔细阅读这篇文章的所有答案,以更好地掌握 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
于 2013-04-01T00:00:13.550 回答