【问题标题】:For loop with variable upper bound具有可变上限的 For 循环
【发布时间】:2013-03-21 23:52:04
【问题描述】:

我想在 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]

【问题讨论】:

    标签: variables for-loop wolfram-mathematica


    【解决方案1】:

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

    • N 是保留字
    • 您的标识符不应以大写字母开头
    • 函数foo[] 应该用SetDelayed (:=) 定义,而不是 带设置 (=)
    • 您需要在函数定义参数中使用模式 (_)
    • For[]loops,一般情况下应该避免迭代 数学

    我认为您可以仔细阅读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
    

    【讨论】:

    • 保留 N 的事实是我最直接的问题。不过,感谢您指出其余部分,特别感谢您向我指出新手问题问题:我需要一段时间来消化它,但它看起来真的很有帮助。此外,您是否知道 Mathematica 与 Scheme 或 Haskell 的良好比较?假装它是 Matlab 显然不能很好地工作,但假装它是 Lisp 也并不总是有效。
    • @ChristopherWhite 不要让语法糖误导你。 Mathematica 是一种函数式的术语重写语言。有一些结构带有副作用,只是为了简化一些复杂的操作,但通常可以避免。您不应该在 Mathematica 中使用循环,真正例外情况除外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多