我寫了一個快速排序的方案(球拍)爲什麼list-ref無法獲得正確的參數?
#lang racket
(define (quick-sort xs)
(let* ([p (list-ref xs 0)]
[tail (list-tail xs 1)]
[less (filter (lambda (x) (< x p)) tail)]
[greater (filter (lambda (x) (>= x p)) tail)])
(append (quick-sort less) (list p) (quick-sort greater))))
但是,當我嘗試了,我得到這個錯誤:
> (quick-sort (list 99 2 9922))
list-ref: index 0 too large for list: '()
我新的計劃,所以我不太明白爲什麼列表裁判不能得到正確的輸入'(99 2 9922)
編輯:
感謝。我做到了。
#lang racket
(define (quick-sort xs)
(let* ([p (first xs)]
[tail (rest xs)]
[less (filter (lambda (x) (< x p)) tail)]
[greater (filter (lambda (x) (>= x p)) tail)])
(if (equal? (length xs) 1)
xs
(append (quick-sort less) (list p) (quick-sort greater)))))
在你的新代碼中,每個輸入都測試了'(equal?(length xs)1)',它總是計算xs的全部長度(一個線性運算)。既然你不關心長度是多少,除非它是1,你可以使用像'(和(not(null?xs))(null?(cdr xs)))'這樣的常量測試。 (我建議斷言該列表不是空的,並且第一個元素*之後的部分*爲空,後者顯然意味着長度爲1,但會導致錯誤,除非該列表非空,因此是第一個條件。) – Carlo