千里马中的重复输出

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" 它。