千里马中的重复输出
Duplicated output in Maxima
我在 Maxima 中实现了冒泡排序方法:
burbuja(l) := block(
for i : 1 step 1 thru length(l) do (
for j : length(l) - 1 step -1 while j >= i do (
if l[j] > l[j + 1] then (
elemento : l[j],
l[j] : l[j + 1],
l[j + 1] : elemento
)
)
), print(l)
);
问题是输出是这样的:
(%i1) burbuja([3,2,1]);
[1, 2, 3]
(%o1) [1, 2, 3]
如果我从倒数第二行中删除 print(l)
,这就是输出:
(%i1) burbuja([3,2,1]);
(%o1) done
问题是如何在不复制的情况下打印结果?
谢谢。
我发现了问题。我应该使用 append(l)
.
而不是 print(l)
而不是 print(l)
只需将 l
到 return 函数中 l
的值。 (不要放return(l)
因为return
的效果其实和其他语言有些不同。)
我还建议在排序之前复制列表,这样您就不会修改原始列表。先尝试 l : copy(l)
。
作为对 Robert Dodier 回答的补充,再多说几句来解释正在发生的事情。 Maxima 的函数式语言具有以下特点:
- 一个区块的最后一项也是这个区块的值"returned";
print
必须作为一个函数而不是一个简单的语句。
这两个想法解释了您的情况:
- 您代码中的
print(l)
在您的屏幕上执行 某些操作 但也是一个表达式 评估为 l(尝试例如 a:print(5)$
将打印数字 5 但还将值 5 分配给变量 a;
- 由于
print(l)
也是您的块中的最后一项,因此您的块将计算为 l。
因此您的代码打印 l 并且 "return" 它。
我在 Maxima 中实现了冒泡排序方法:
burbuja(l) := block(
for i : 1 step 1 thru length(l) do (
for j : length(l) - 1 step -1 while j >= i do (
if l[j] > l[j + 1] then (
elemento : l[j],
l[j] : l[j + 1],
l[j + 1] : elemento
)
)
), print(l)
);
问题是输出是这样的:
(%i1) burbuja([3,2,1]);
[1, 2, 3]
(%o1) [1, 2, 3]
如果我从倒数第二行中删除 print(l)
,这就是输出:
(%i1) burbuja([3,2,1]);
(%o1) done
问题是如何在不复制的情况下打印结果?
谢谢。
我发现了问题。我应该使用 append(l)
.
print(l)
而不是 print(l)
只需将 l
到 return 函数中 l
的值。 (不要放return(l)
因为return
的效果其实和其他语言有些不同。)
我还建议在排序之前复制列表,这样您就不会修改原始列表。先尝试 l : copy(l)
。
作为对 Robert Dodier 回答的补充,再多说几句来解释正在发生的事情。 Maxima 的函数式语言具有以下特点:
- 一个区块的最后一项也是这个区块的值"returned";
print
必须作为一个函数而不是一个简单的语句。
这两个想法解释了您的情况:
- 您代码中的
print(l)
在您的屏幕上执行 某些操作 但也是一个表达式 评估为 l(尝试例如a:print(5)$
将打印数字 5 但还将值 5 分配给变量 a; - 由于
print(l)
也是您的块中的最后一项,因此您的块将计算为 l。
因此您的代码打印 l 并且 "return" 它。