Scheme 方案cond陷入了一个循环中 (定义(排序列表长度loop1 loop2 temp) (cond((>=loop1长度) (名单) ((=loop2长度) (设置!loop1(+loop1)) (设置!loop2(+loop1))) ((列表参考列表循环1)(列表参考列表循环2))) (设置车辆温度(列表参考列表1)) (列表集!列表循环1(列表参考列表循环2)) (列表集!列表环2温度) (设置汽车!温度'()) ) (设置!loop2(+loop2 1)) ) ) (排序列表长度loop1 loop2 temp)) )
)Scheme 方案cond陷入了一个循环中 (定义(排序列表长度loop1 loop2 temp) (cond((>=loop1长度) (名单) ((=loop2长度) (设置!loop1(+loop1)) (设置!loop2(+loop1))) ((列表参考列表循环1)(列表参考列表循环2))) (设置车辆温度(列表参考列表1)) (列表集!列表循环1(列表参考列表循环2)) (列表集!列表环2温度) (设置汽车!温度'()) ) (设置!loop2(+loop2 1)) ) ) (排序列表长度loop1 loop2 temp)) ),scheme,Scheme,) 您好,这是一个方案递归函数的一个尾部递归函数。第二部分似乎有问题,因为它开始卡在一个循环中。可能是语法错误,因为当我在终端中尝试时,代码行似乎单独工作 我将根据以下两个观点对您的函数进行一点重新构造: 方案列表不是随机访问的,所以使用列表索引不是一个好方法。(特别是,list ref和list set!都是O(n)操作。) 使用广泛变异也不是很有计划。事实上,有些实现,如Racket,具有不可变的列表 下面是我如何使用相同的算法重写函数(请注意,排序在没有变异的情况下不容易实现(相比之下,您
您好,这是一个方案递归函数的一个尾部递归函数。第二部分似乎有问题,因为它开始卡在一个循环中。可能是语法错误,因为当我在终端中尝试时,代码行似乎单独工作 我将根据以下两个观点对您的函数进行一点重新构造:
list ref
和list set!
都是O(n)操作。)cond
更干净,因此我的版本根本不使用cond
示例用法(在Guile上测试):
若你们想使用随机存取的数据结构,那个么在Scheme中称为vector。以下是向量的相同算法:
> (define lst (list 3 1 4 1 5 9)) ; important: **not** '(3 1 4 1 5 9)
> (sort! lst)
> lst
(1 1 3 4 5 9)
请注意,我对左侧和右侧向量索引使用I
和j
,而不是列表版本使用的lhs
和rhs
左侧和右侧“游标”
使用示例(在球拍上测试):
(define (sort! lst)
(let outer ((lhs lst))
(unless (null? lhs)
(let inner ((rhs (cdr lhs)))
(if (null? rhs)
(outer (cdr lhs))
(let ((a (car lhs))
(b (car rhs)))
(when (> a b)
(set-car! lhs b)
(set-car! rhs a))
(inner (cdr rhs))))))))
> (define lst (list 3 1 4 1 5 9)) ; important: **not** '(3 1 4 1 5 9)
> (sort! lst)
> lst
(1 1 3 4 5 9)
(define (sort! vec)
(let outer ((i 0))
(unless (>= i (vector-length vec))
(let inner ((j (+ i 1)))
(if (>= j (vector-length vec))
(outer (+ i 1))
(let ((a (vector-ref vec i))
(b (vector-ref vec j)))
(when (> a b)
(vector-set! vec i b)
(vector-set! vec j a))
(inner (+ j 1))))))))
> (define vec (vector 3 1 4 1 5 9))
> (sort! vec)
> vec
#(1 1 3 4 5 9)