Loops 循环不';我不能正常工作

Loops 循环不';我不能正常工作,loops,scheme,Loops,Scheme,所以 (让循环((p(-(长度lst)1))(i0)(llst)) (续) (=P0) lst) (=IP) (环路(+p-1)0升)) ((>(矢量参考(转换lst)i)(矢量参考(转换lst)p)) (循环(+p0)(+i1)(交换(转换l)ip))) (

所以

(让循环((p(-(长度lst)1))(i0)(llst))
(续)
(=P0)
lst)
(=IP)
(环路(+p-1)0升))
((>(矢量参考(转换lst)i)(矢量参考(转换lst)p))
(循环(+p0)(+i1)(交换(转换l)ip)))
(<(矢量参考(转换lst)i)(矢量参考(转换lst)p))
(环路(+p0)(+i1)l)))

当我发送
(3 2 1)
lst
时,它将在
(=p 0)
上返回原始状态,但当我单独运行
交换
函数时,它将返回
”#(1 2 3)
p
是最后一个数组,
i
是数组的第一个。

使用
l
而不是
lst
返回最终值,而不是原始值

您从
l=lst
开始,在循环中每一步更改
l

当您达到最终条件时,只需返回您所构建的,
l
”#(3 2 1)
是向量表示法。A
(list'#(3 2 1))
作为输入应该返回
(#(1 2 3))

然而,这并不是最糟糕的事情。在同一种情况下多次在列表和向量之间转换表示出了问题。你花费了大量的时间和内存来制作一个向量,而你只使用一个。我的建议是在输入时转换为向量,在输出时转换为列表

并且可以进行一些符号改进。通常,在类型之间转换的lisp函数在类型之间用“->”表示。因此
convert
应该是(list->vector),您应该有一个相应的(vector->list)。一个函数不应同时执行这两项操作,至少在没有显式参数的情况下不应这样做,以避免数据类型出错

另外,
swap
应该是
swap!
,因为它在适当的位置改变了数据结构

还有一个逻辑错误。如果输入列表中的两个元素相等,您将遍历所有cond子句并触发异常

(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))) 

因此,在元素相等的情况下,
=
,循环就完成了?它至少会终止。
convert
做什么?如果参数是一个向量,为什么参数名表示它是一个列表?convert只是更改为list to vector,condition=p0将终止这个过程。你的转换是什么g您的结果。
lst
永远不会更改,这就是您返回的结果。最后一个应该使用
else
而不是
(>…)
因为如果它不大,它等于或小于。不需要检查它。我不知道这应该做什么,但它显然不应该工作。你的问题与命名的
let
无关。你能提供一个最小的完整示例,包括
转换
交换
的定义吗l作为
lst
的值?举例说明,我们可以不必猜测就可以运行。(请参阅)如果您的问题已解决,您应该发布答案并接受它,这样这些问题就不再标记为未解决。
(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)))