循环无法正常工作

时间:2018-07-31 01:13:26

标签: loops scheme

所以

(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是该数组的第一个。

2 个答案:

答案 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)))