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