【发布时间】:2019-04-20 03:06:45
【问题描述】:
如何在 Scheme 中实现一个程序,获取给定列表的元素并返回一个新列表,其中元素是前一个列表的随机集合?我希望它可以工作任何长度。例如:
输入:'(a e i o u),输出:'((a e) (i o) (u)),长度为 2。
我的尝试(使用 for/list)很笨拙并且基于递归。我按照 Óscar 的建议划分了任务:
-
从列表 l 中随机选择 n 个元素:
(define (pick-n-random l n) (take (shuffle l) n)) -
从列表 l1 中删除列表 l2:
(define (cut l1 l2) (cond ((null? l1) '()) ((not (member (car l1) l2)) (cons (car l1) (cut (cdr l1) l2))) (else (cut (cdr l1) l2))))
然后,这就是我的问题:我如何递归这个过程以获得预期的程序?我应该使用for/list 粘贴此过程 1. 和 2. 获得的所有子列表吗?
【问题讨论】:
-
您使用的是哪个 Scheme 变体?是兼容 R6RS、兼容 R5RS、Racket 还是其他?
-
我正在终端中运行“mzscheme”,如下所示:stackoverflow.com/questions/1175977/…
-
等等,我刚刚意识到您的示例输出不是随机的。你想随机化什么,内容(正如我在回答中所做的那样)或子列表的长度?
-
内容,和你一样。谢谢。
-
好吧,没关系:)。不客气!
标签: functional-programming scheme lisp