簡體   English   中英

方案:電源設置遞歸,使用R5RS按排序順序打印

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM