2013-03-31 95 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中使用循環,除了**真的**特殊情況。 –