2012-10-09 72 views
1

陣列在這個例子中我試圖創建長度5的陣列,其中每個ellement含有的倍0.3數函數返回一個值可以在不超過1相加。即3次。因此,每個元素應該包含數字3。這裏是我的代碼:如何從用於初始化的Mathematica

Array[(
    workingCount = 0; 
    workingSum = 0; 
    done = false; 
    While[! done, 
    workingSum = workingSum + .3; 
    If[workingSum > 1, done = true; workingCount, workingCount++] 
    ]) 
    , 5] 

在第3至最後一行有我有沒有workingCount後它;,因爲它似乎是在數學省略;導致價值的說明決定返回。

相反,我得到這個:

{Null[1], Null[2], Null[3], Null[4], Null[5]} 

爲什麼會出現這種情況?我怎樣才能讓我的程序做我想做的事?即在傳遞給Array以初始化元素的函數的上下文中,如何使用複雜的多行函數?

在此先感謝。

回答

1

你的問題來自於您要初始化數組,但正在努力沒有明確的函數調用這樣做的事實 - 這是你需要做什麼。

看到這裏的文檔在陣列中的數學: http://reference.wolfram.com/mathematica/ref/Array.html

那一邊,小錯誤(true和false必須是大寫),這是你想要做什麼:

f[x_] := 
    (
    workingCount = 0; 
    workingSum = 0; 
    done = False; 

    While[done != True, workingSum = workingSum + 0.3; 
    If[workingSum > 1, done = True, workingCount++] 
    ]; 
    Return[workingCount]; 
    ); 

Array[f, 5] (* The array here is generating 5 values of the return value of f[x_] *) 
+0

而且,我忘了提,你的情況,你需要一個return語句,這就是爲什麼你的陣列將填充空值。或者,不像我向您展示的命名函數那樣,您可以使用@belisarius建議的匿名函數(&符號)。 – jrd1

+1

你應該返回workingCount,而不是workingSum :) –

+0

啊!我明白你在說什麼@belisarius。接得好!編輯。 – jrd1

2

兩件事情:

首先,一個辦法能做到這一點的數學是

Array[ 
Catch[ 
    workingCount = 0; 
    workingSum = 0; 
    done = False; 
    While[! done, 
    workingSum = workingSum + .3; 
    If[workingSum > 1, 
    done = True; [email protected], 
    workingCount++]]] &, 
5] 

其次,也是最重要的:你永遠不應該在Mathematica中做到這一點!真。

請訪問例如Stack Exchange site for Mathematica,並閱讀問題的答案那裏得到的編程風格的一些抓地力。

+0

+1使用Catch! **和**,匿名功能。 – jrd1