[英]Scheme: power set recursion, printing in sorted order using R5RS
方案子集遞歸問題
對於冪函數:
(define (p l)
(define (n next)
(if (null? next)
'()
(cons (car next)
(cons (cons (car l) (car next))
(n (cdr next))))))
(if (null? l)
'(())
(n (p (cdr l)))))
我只想使用R5RS按元素數量的升序打印所有集合,並按排序順序打印相同的大小。 例如,
如果我定義這樣的列表
(define list3 (list '1 '2 '3))
並調用該功能,
(p'(1 2 3))
我的輸出是
(() (1) (2) (1 2) (3) (1 3) (2 3) (1 2 3))
但是我想像這樣打印出來:
(() (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3))
另外,對於
(p'(1 2 3 4))
我的輸出是:
(()
(1)
(2)
(1 2)
(3)
(1 3)
(2 3)
(1 2 3)
(4)
(1 4)
(2 4)
(1 2 4)
(3 4)
(1 3 4)
(2 3 4)
(1 2 3 4))
但我想要
(()
(1)
(2)
(3)
(4)
(1 2)
(1 3)
(1 4)
(2 3)
(2 4)
(3 4)
(1 2 3)
(1 2 4)
(1 3 4)
(2 3 4)
(1 2 3 4))
如何進行正確的輸出?
有一個簡單的選擇:使用當前的電源設置過程實現並根據需要對輸出進行排序:
(define (compare s1 s2)
(let ((cmp (- (length s1) (length s2))))
(cond ((negative? cmp) #t)
((positive? cmp) #f)
(else (less-than? s1 s2)))))
(define (less-than? s1 s2)
(cond ((or (null? s1) (null? s2)) #f)
((< (car s1) (car s2)) #t)
((> (car s1) (car s2)) #f)
(else (less-than? (cdr s1) (cdr s2)))))
但這很重要-我們需要一個sort
過程,並且這不是R5RS的一部分:
(sort (p '(1 2 3)) compare)
=> '(() (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3))
當然,這並不難實現接收,用於比較要素的程序自己的排序方法。 或者,如果允許,則可以從現有庫(例如SRFI之一)中將其導入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.