我正在嘗試在方案中使用一個需要兩個引數、一個樞軸和一個串列的磁區來執行快速排序。
如果我要跑步:
=>(磁區'3'(5 7 8 6 4 2 1))
我希望輸出為:
=>;值:((2 1)(3 5 7 8 6 4))
我正在使用這段代碼:
(define (partition lt? lst)
(if (null? lst)
(values '() '())
(let ((rest (cdr lst)))
(if (lt? (car lst) (car rest))
(let ((left (partition lt? rest)))
(values (cons (car lst) (car left))
(cdr left)))
(let ((right (partition lt? rest)))
(values (car right)
(cons (car lst) (cdr right)))))))
它給出以下錯誤: 輸出
uj5u.com熱心網友回復:
我為你寫了這個
(define (partition lt? pivot lst)
((lambda (s) (s s lst list))
(lambda (s l* c)
(if (null? l*)
(c '() '())
(let ((x (car l*)))
(s s (cdr l*)
(lambda (a b)
(if (lt? x pivot)
(c (cons x a) b)
(c a (cons x b))))))))))
這是一個測驗
1 ]=> (partition < '3 '(5 7 8 6 4 2 1))
;Value: ((2 1) (5 7 8 6 4))
uj5u.com熱心網友回復:
您對磁區的定義需要一個程序lt?和一個串列,但您是3作為程序發送的。您也許應該有 3 個引數lt?,pivot和lst? 這是您的錯誤訊息的來源。這是對這種型別的錯誤及其可能來源的更詳細的解釋。
代碼中有更多錯誤。partition回傳兩個值,但您的代碼在呼叫自身時未使用適當的步驟來接收更多值,例如。let-values. 一些代碼似乎期望一個帶有結果的串列而不是兩個結果。
您還應該從最簡單的情況開始測驗。我會先做這些:
(partition > 3 '()) ; ==> (), ()
(partition > 3 '(1)) ; ==> (), (1)
(partition < 3 '(1)) ; ==> (1), ()
(partition < 3 '(4)) ; ==> (), (4)
(partition < 3 '(1 4)) ; ==> (1), (4)
(partition < 3 '(1 2 4)) ; ==> (1 2), (4)
(partition < 3 '(1 3 4)) ; ==> (1), (3 4)
uj5u.com熱心網友回復:
除了將數字作為預期作為函式的引數傳遞的問題之外,您還有另一個大問題。您的partition函式回傳兩個值,但它是遞回的,每次呼叫它時,您都沒有捕獲它們,因此很難實際構建磁區串列。
這里有幾種方法可以做到這一點。我建議的第一個是尾遞回,這要歸功于命名的 let并且僅實際values用于其最終回傳值。另一個演示了call-with-values捕獲遞回呼叫回傳的兩個值的標準函式。
還有一個測驗工具,演示了另一種捕獲多個值的方法,即SRFI-11let-values,它往往比call-with-values. 還有SRFI-8 是receive這里未顯示的另一種方式。
(define (partition lt? what lst)
(let loop ((lst lst)
(lt '())
(gte '()))
(cond ((null? lst)
(values (reverse lt) (reverse gte)))
((lt? (car lst) what)
(loop (cdr lst) (cons (car lst) lt) gte))
(else
(loop (cdr lst) lt (cons (car lst) gte))))))
(define (partition2 lt? what lst)
(if (null? lst)
(values '() '())
(call-with-values (lambda () (partition2 lt? what (cdr lst)))
(lambda (lt gte)
(if (lt? (car lst) what)
(values (cons (car lst) lt) gte)
(values lt (cons (car lst) gte)))))))
;;; Uses list= from SRFI-1 and let-values from SRFI-11 and format from SRFI-48
(define (test-partition op num lst expected-left expected-right)
(let-values (((actual-left actual-right) (partition op num lst)))
(format #t "(partition ~A ~S ~S) => ~S and ~S: " (if (eqv? op <) "<" ">") num lst
actual-left actual-right)
(if (or (not (list= = actual-left expected-left))
(not (list= = actual-right expected-right)))
(format #t "FAIL. Expected ~S and ~S instead.~%" expected-left expected-right)
(format #t "PASS~%"))))
(test-partition > 3 '() '() '())
(test-partition > 3 '(1) '() '(1))
(test-partition < 3 '(1) '(1) '())
(test-partition < 3 '(4) '() '(4))
(test-partition < 3 '(1 4) '(1) '(4))
(test-partition < 3 '(1 2 4) '(1 2) '(4))
(test-partition < 3 '(1 3 4) '(1) '(3 4))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487390.html
