我是千里马的新人。我需要从嵌套循环中断开并返回到第一个循环。这是我的代码
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之间的区别吗?
答案 0 :(得分:1)
return
在Maxima中的含义与在其他编程语言中的含义不同。这意味着只返回block
的值;这还不足以满足你的需求。
打破内部循环并从内部循环到外部循环获取值的一种方法是使用throw
和catch
。请注意使用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
编辑:您可以将return
与block
一起使用,但是您必须将其包含在另一个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
。
throw
与catch
函数一起使用。 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)
表示肯定x
,throw(x)
表示否定x
。 g(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