为什么我必须用列表两次包围n以获得正确的结果?

时间:2016-03-24 17:08:25

标签: scheme racket

(define (all-sublists buffer n)
  (cond ((= n 0) n)
        ((all-sublists (append buffer (list (list n)) (map (lambda (x) (append (list n) x)) buffer)) (- n 1)))))

结果如下:

(all-sublists '((3) (2) (2 3) (1) (1 3) (1 2) (1 2 3)) 0)

当n周围只有一个列表时:

(define (all-sublists buffer n)
  (cond ((= n 0) n)
        ((all-sublists (append buffer (list n) (map (lambda (x) (append (list n) x)) buffer)) (- n 1)))))

结果得到一个虚线对:

(all-sublists '(3 2 (2 . 3) 1 (1 . 3) (1 . 2) (1 2 . 3)) 0)

1 个答案:

答案 0 :(得分:1)

不是你有"用列表两次包围n以获得正确的结果",事实是你的代码有几个问题,对于初学者:{{1的最后一个条件应该以{{1​​}}开头,并且您错误地使用cond。如果我理解正确,你只需要列表的powerset:

else

像这样:

append