for-loop - 初学者的基本问题。bucle 中的定义存在问题。枫
问题描述
假设我们在这种情况下(我正在使用 Maple)
add:=function()
e1:=0;
e2:=1;
for j in [1..2]do
ej:=ej+1
od;
return e1,e2;
end;
这个程序给了我一个全局变量错误。我理解为什么会发生这种情况——因为ej
没有定义为本地的——但是如果你定义它,那么程序就什么也不做。) 我不知道如何解决它。我的目标(在更大的程序中)是e1,e2
循环for
调用。
也许我没有正确表达自己来简化我的问题,有我的程序,它是用程序 GAP 制作的,但它的工作原理类似于 Maple:
G12Decode:=function(c)
localx,G,C,sG,sH,a,u,b1,e1,b2,e2,b3,e3,b4,e4,b5,e5,b6,e6,h1,h2,i,j;
x:=Codeword(c,GF(3));
G:=[[1,0,0,0,0,0,0,1,1,1,1,1],[0,1,0,0,0,0,1,0,1,2,2,1],
[0,0,1,0,0,0,1,1,0,1,2,2],[0,0,0,1,0,0,1,2,1,0,1,2],
[0,0,0,0,1,0,1,2,2,1,0,1],[0,0,0,0,0,1,1,1,2,2,1,0]];
C:=GeneratorMatCode(G,GF(3));
sG:=x*TransposedMat(GeneratorMat(C));
sH:=x*TransposedMat(CheckMat(C));
a:=[0,0,0,0,0,0];
b1:=Codeword([0,1,1,1,1,1],GF(3));
e1:=Codeword([1,0,0,0,0,0],GF(3));
b2:=Codeword([1,0,1,2,2,1],GF(3));
e2:=Codeword([0,1,0,0,0,0],GF(3));
b3:=Codeword([1,1,0,1,2,2],GF(3));
e3:=Codeword([0,0,1,0,0,0],GF(3));
b4:=Codeword([1,2,1,0,1,2],GF(3));
e4:=Codeword([0,0,0,1,0,0],GF(3));
b5:=Codeword([1,2,2,1,0,1],GF(3));
e5:=Codeword([0,0,0,0,1,0],GF(3));
b6:=Codeword([1,1,2,2,1,0],GF(3));
e6:=Codeword([0,0,0,0,0,1],GF(3));
if Weight(sH)<=2 then
sH:=ShallowCopy(VectorCodeword(sH));
Append(a,sH);
a:=Codeword(a,GF(3));
u:=x-a;
return u;
elif Weight(sG)<=2 then
sG:=ShallowCopy(VectorCodeword(sG));
Append(sG,a);
sG:=Codeword(sG,GF(3));
u:=x-sG;
return u;
else
for i in [1..6] do
for j in [1..6] do
if sG-bi=ej or sG-bi=2*ej then
h1:=sG-bi;
h2:=ei;
h1:=ShallowCopy(VectorCodeword(h1));
h2:=ShallowCopy(VectorCodeword(h2));
Append(h1,h2);
h1:=Codeword(h1,GF(3));
u:=x-h1;
return u;
elif sG-2*bi=ej or sG-2*bi=2*ej then
h1:=sG-2*bi;
h2:=ei;
h1:=ShallowCopy(VectorCodeword(h1));
h2:=ShallowCopy(VectorCodeword(h2));
Append(h1,h2);
h1:=Codeword(h1,GF(3));
u:=x-h1;
return u;
fi;
od;
od;
fi;
end;
该程序不会向我发送错误,但我知道它因为 ej、bi 和 ei 而不起作用。我想做最后一个“其他”之后所说的,但我不知道如何解决它以使其工作。
解决方案
您的语法无效。它是proc,而不是function。
并且add已经是 Maple 命令,所以它是一个受保护的名称,不能分配给它。您必须使用另一个名称。
而且您的 do-loop 语法可能不是您想要的。您可能希望j 从 1 到 2 do。
在执行递归赋值ej:=ej+1之前,你真的应该用一个值初始化ej。
你不妨声明过程的局部变量。
就个人而言,我更喜欢在现代 Maple 中使用end do而不是od和end proc而不是end 。它可以更容易地判断正在终止的内容。
例如,
restart;
my_add:=proc()
local e1,e2,ej,j;
e1:=0;
e2:=1;
ej:=0;
for j from 1 to 5 do
ej:=ej+1
end do;
return ej,e1,e2;
end proc:
my_add();
5, 0, 1
有一个Maple 编程指南,您可以在线阅读或在 Maple 自己的帮助系统中阅读。它对编写程序有很好的介绍。proc命令还有一个更详细的帮助页面。