所以
(let loop ((p (- (length lst) 1)) (i 0) (l lst))
(cond
((= p 0)
lst)
((= i p)
(loop (+ p -1) 0 l))
((> (vector-ref (convert lst) i) (vector-ref (convert lst) p))
(loop (+ p 0) (+ i 1) (swap (convert l) i p)))
((< (vector-ref (convert lst) i) (vector-ref (convert lst) p))
(loop (+ p 0) (+ i 1) l)))
当我发送(= p 0)
的{{1}}时,它将在lst
上返回原始状态,但是当我分别运行'#(3 2 1)
函数时,它将返回swap
。 '#(1 2 3)
是最后一个数组,p
是该数组的第一个。
答案 0 :(得分:1)
使用l
而不是lst
来返回 final 值,而不是原始。
您从l = lst
开始,然后逐步进行更改l
的循环。
达到最终条件时,只需返回已构建的内容l
。
答案 1 :(得分:1)
'#(3 2 1)
是向量符号。以(list '#(3 2 1))
作为输入应返回(#(1 2 3))
但是,这并不是最糟糕的事情。在相同条件下多次在列表和向量之间进行覆盖表示信号出了问题。您要花费大量时间和内存来制作仅使用一个的向量。我的建议是在导入时转换为矢量,在导出时转换为列表。
可以对符号进行一些改进。通常,在类型之间转换的lisp函数在类型之间用“->”表示。因此convert
应该是(list-> vector),并且您应该有一个对应的(vector-> list)。一个函数至少应该在没有显式参数的情况下做这两个事情,以免弄错数据类型。
swap
也应为swap!
,因为它会改变数据结构。
还有一个逻辑错误。如果输入列表中的两个元素相等,则将遍历所有cond子句并触发异常。
(let loop ((p (- (length lst) 1)) (i 0) (vec (list->vector l))
(cond
((= p 0)
(vector->list lst))
((= i p)
(loop (- p 1) 0 l))
((> (vector-ref vec i) (vector-ref vec p))
(loop p (+ i 1) (swap! vec i p)))
(else
(loop p (+ i 1) l)))