Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 在scheme中随机抽取元素组_Functional Programming_Scheme_Lisp - Fatal编程技术网

Functional programming 在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)

如何在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)
      (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))