Functional programming 在scheme中随机抽取元素组
如何在Scheme中实现一个程序,获取给定列表的元素并返回一个新列表,其中元素是前一个列表的随机集合?我希望它能工作任何长度。例如: 输入:Functional programming 在scheme中随机抽取元素组,functional-programming,scheme,lisp,Functional Programming,Scheme,Lisp,如何在Scheme中实现一个程序,获取给定列表的元素并返回一个新列表,其中元素是前一个列表的随机集合?我希望它能工作任何长度。例如: 输入:”(aeiou),输出:”((ae)(iou))长度为2 我的尝试(使用for/list)很笨拙,而且是基于递归的。我按照Óscar的建议划分了任务: 从列表l中随机选择n个元素: (define (pick-n-random l n) (take (shuffle l) n)) 从列表l1中删除列表l2: (define (cut l1 l2)
”(aeiou)
,输出:”((ae)(iou))
长度为2
我的尝试(使用for/list)很笨拙,而且是基于递归的。我按照Óscar的建议划分了任务:
(define (pick-n-random l n)
(take (shuffle l) n))
(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.?如果我们把问题分成几块会更容易。首先,让我们编写两个过程,允许我们从列表中提取或删除n
元素,如果列表中没有足够的元素,则会产生适当的结果(如果不是这样,我们可以使用内置的take
和drop
):
最后,我们将分组过程与shuffle
相结合,这将使列表的内容随机化:
(define (random-groups lst n)
(group (shuffle lst) n))
它按预期工作:
(random-groups '(a e i o u) 2)
=> '((e a) (u i) (o))
您使用的是哪种方案?是R6RS兼容、R5RS兼容、Racket还是其他什么?我正在终端中运行“mzscheme”,正如这里所建议的:等等,我刚刚意识到您的样本输出不是随机的。你想随机化什么,内容(正如我在回答中所做的)还是子列表的长度?内容,正如你所做的。谢谢。那好吧,没关系:)。不客气!非常感谢。我的方法是不同的,包含了一种我无法解决的递归:1。随机选取一组元素2。剪切列表,删除第一组和第三组。在这个过程中递归。我有一个。二,。工作正常,但在3上失败。有什么建议可以用我的想法递归地做吗?好吧,你应该编辑你的帖子,并添加代码作为问题的一部分。但这基本上与我的方法相同:先将列表随机化,然后取适当大小的块。诀窍是将问题分成更小的部分,并在每个部分中集中于单个问题。好的,我自己试试看。
(define (random-groups lst n)
(group (shuffle lst) n))
(random-groups '(a e i o u) 2)
=> '((e a) (u i) (o))