千里马的投掷回报和休息之间的差异

时间:2016-03-13 11:33:56

标签: loops nested return break maxima

我是千里马的新人。我需要从嵌套循环中断开并返回到第一个循环。这是我的代码

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
    )
)

随着投掷它什么都不做;中断并返回它是相同的并继续计算而不会破坏嵌套循环。

我可以要求解释一下这个例子中throw,break和return之间的区别吗?

2 个答案:

答案 0 :(得分: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))));

我会留给你决定哪个解决方案不那么难看......

答案 1 :(得分: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然后输入exit退出计算,然后Maxima根据k*10的新值评估下一个表达式k

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