2016-03-13 34 views
1

我是馬克西馬新人。我需要從嵌套循環中斷開並返回到第一個循環。這裏是我的代碼投擲回報與馬克西姆破發之間的區別

for i:1 while i<= p do (
if i=r then return 
else(
    for j:1 while j<= q do (
     if j=s and X[i][j]#0 
     then (
     mult:entier(X[i][j]/vezb), 
     X:ratsimp(rowop(X,i,r,mult)), 
     return 
     ) 
     else return 
    ) 
) 

隨着扔它什麼都不會做;中斷並返回它是相同的,並繼續計算而不會從嵌套循環中斷開。

我可以要求解釋這個例子中拋出,折斷和返回之間的區別嗎?

回答

1

return在Maxima中的含義與其他編程語言不同。這意味着只返回block的值;這不足以滿足你在這裏需要的東西。

破壞內部循環並從內部循環獲取值到外部循環的一種方法是使用throwcatch。請注意使用throw將內部循環的值發送到外部循環,其中catch接收該值。

(%i6) for i thru 10 
     do print ("found j =", catch (for j thru 10 
            do if i = j then throw (j))); 
found j = 1 
found j = 2 
found j = 3 
found j = 4 
found j = 5 
found j = 6 
found j = 7 
found j = 8 
found j = 9 
found j = 10 
(%o6)        done 

編輯:您可以使用returnblock但你必須把它包起來在另一return,即:for i thru 10 do print ("found j =", for j thru 10 do if i = j then return (block (return (j))));

我將讓你來決定哪種解決方案是不太難看...

+0

'return'會和'throw/catch'做同樣的事,不是嗎?從Maxima手冊:*通常由do語句返回的值是完成的原子。然而,函數返回可以用在body內部過早地退出do並給它任何期望的值。*'對於我通過10做print(「找到j =」,對於j通過10如果i = j則返回j));'似乎與'throw/catch'版本做同樣的事情。 – austinlorenz

+0

如果你在'block'內部有'return(j)'(ie'for i thru 10 print print(「found j =」,for j through 10 do do if i = j then block(return(j)));' ),那麼它就不會有預期的效果了。如果你想走上這條路,就意味着你必須有一個返回值,或者你可以使用'block' - 我不認爲這是可行的。但我不得不承認'拋出'''catch'也是一種醜陋。 –

+0

@LassiterRoofingTeam我想你可以寫'return(block(return(...)))' - 我編輯了我的答案來證明這一點。它仍然非常難看。 –

0

return需要參數。例如,如果您想返回true,則需要編寫return(true)return停止迭代並將其參數的值作爲循環的值返回。

break的目的是讓您在計算過程中改變環境(例如全局變量)。

(%i1) k : 10; 
(%o1)        10 
(%i2) (break(k*10),k*10); 
100 

Entering a Maxima break point. Type 'exit;' to resume. 
_k : 20; 
20 
_exit; 
(%o2)        200 

所以k設置爲10,和break(k*10)計算的表達式k*10,則暫停計算,讓我換個環境,在這一點上,我設置k : 20和類型出口恢復的計算,然後千里馬針對新值k評估下一個表達式k*10

throwcatch函數一起使用。 catch(e1,e2,...,en)評估表達式e1,e2,...,en。如果這些評估都不是throw函數,則catch返回值en。如果其中一個表達式的計算結果爲throw函數,則返回throw函數的值,並且不評估其餘表達式。

(%i1) h(x) := if x < 0 then throw(x) else f(x)$ 
(%i2) g(l) := catch (map (h, l))$ 

h(x)回報f(x)積極xthrow(x)xg(l)h映射到列表l上,並捕獲任何拋出的值。因此,如果在列表中沒有負整數,g返回應用到每個整數f列表:

(%i3) g([1, 2, 3, 4]); 
(%o3)     [f(1), f(2), f(3), f(4)] 

而且如果在列表中的負整數,則g漁獲第一個這樣的整數,並返回。

(%i4) g([1, 2, -3, 4]); 
(%o4)        - 3