这是一种递归算法,用于产生集合的所有子集。等效的 Python 代码是:
def subsets(s):
if not s:
yield ()
else:
for e in subsets(s[1:]):
yield s[:1] + e
yield e
for s in subsets((1,2,3)):
print(s)
结果:
>>>
(1, 2, 3)
(2, 3)
(1, 3)
(3,)
(1, 2)
(2,)
(1,)
()
这是我试过的球拍版本:
#lang racket
(require racket/generator)
(define (subsets x)
(generator ()
(let recur ([s x])
(if (null? s)
(yield '())
(for ([e (in-producer (recur (cdr s)))])
(yield (cons (car s) e))
(yield e))))))
(for/list ([j (in-producer (subsets '(1 2 3)))])
(display j))
但它不起作用:
Welcome to DrRacket, version 6.0.1 [3m].
Language: racket; memory limit: 128 MB.
(). . result arity mismatch;
expected number of values not received
expected: 1
received: 0
values...:
Racket文档中似乎没有相关示例是否可能,如何?