【问题标题】:bubble-sort procedure in scheme方案中的冒泡排序过程
【发布时间】:2015-08-03 04:12:49
【问题描述】:

我不明白为什么 (bubble-sort! (vector 2 1)) 在我的代码中返回 #(2 2)。

(define (bubble-sort! v)
    (define (helper c orig-v n)
    (cond
        ((< n 0)
            v)
        ((> c n)
            (helper 0 v (- n 1)))
        ((>= (vector-ref orig-v c) (vector-ref orig-v (+ c 1)))
            (begin
                (vector-set! v (+ c 1) (vector-ref orig-v c))
                (vector-set! v c (vector-ref orig-v (+ c 1)))
                (helper (+ c 1) v n)))
        (else
            (helper (+ c 1) v n))))
(helper 0 v (- (vector-length v) 2)))

我自己跟踪过我的代码,但没有发现问题。

【问题讨论】:

    标签: sorting vector scheme racket bubble-sort


    【解决方案1】:

    在您的代码中,vorig-vsame 向量(如果您将向量作为参数传递,则该向量不会被复制:这类似于“按引用调用”它在其他语言中被调用)。

    所以在函数内部你处理作为参数传递的向量,以及两个表达式:

    (vector-set! v (+ c 1) (vector-ref orig-v c))
    (vector-set! v c (vector-ref orig-v (+ c 1)))
    

    等价于:

    (vector-set! orig-v (+ c 1) (vector-ref orig-v c))
    (vector-set! orig-v c (vector-ref orig-v (+ c 1)))
    

    所以将2复制到第二个元素中(其中包含1),然后将2复制回第一个元素中,最终结果为#(2,2)。

    【讨论】:

    • @qaz 更改初始助手调用以复制向量。 (helper 0 (vector-copy v) (- (vector-length v) 2)) 这将解决 Renzo 指出的问题。
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2015-03-18
    • 2012-05-07
    • 2019-04-21
    • 2010-11-24
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多