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)操作。)
  • 使用广泛变异也不是很有计划。事实上,有些实现,如Racket,具有不可变的列表
  • 下面是我如何使用相同的算法重写函数(请注意,排序在没有变异的情况下不容易实现(相比之下,您可以在没有任何变异的情况下实现mergesort),因此我的版本仍然有一些变异,但不如您的;-):

    请注意,使用此内部/外部循环结构比您使用的
    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)