List 查找X的所有可能列表
我想创建一个函数构造元组,它使用长度为m和Nat n的列表,并生成所使用列表元素列表中所有可能的n元组。下面的检查给出了函数应产生的内容:List 查找X的所有可能列表,list,tuples,racket,List,Tuples,Racket,我想创建一个函数构造元组,它使用长度为m和Nat n的列表,并生成所使用列表元素列表中所有可能的n元组。下面的检查给出了函数应产生的内容: (check-expect (construct-tuples '(+ -) 3) '((+ + +) (+ + -) (+ - +) (+ - -) (- + +) (- + -) (- - +) (- - -))) (check-expect (construct-tuples
(check-expect (construct-tuples '(+ -) 3)
'((+ + +) (+ + -) (+ - +) (+ - -)
(- + +) (- + -) (- - +) (- - -)))
(check-expect (construct-tuples empty 3) (list empty))
(check-expect (construct-tuples '(+ -) 0) (list empty))
(check-expect (construct-tuples '(+ - * /) 4)
(list
(list '+ '+ '+ '+)
(list '+ '+ '+ '-)
(list '+ '+ '+ '*)
(list '+ '+ '+ '/)
(list '+ '+ '- '+)
(list '+ '+ '- '-)
(list '+ '+ '- '*)
(list '+ '+ '- '/)
(list '+ '+ '* '+)
(list '+ '+ '* '-)
(list '+ '+ '* '*)
(list '+ '+ '* '/)
(list '+ '+ '/ '+)
(list '+ '+ '/ '-)
(list '+ '+ '/ '*)
(list '+ '+ '/ '/)
(list '+ '- '+ '+)
(list '+ '- '+ '-)
(list '+ '- '+ '*)
(list '+ '- '+ '/)
(list '+ '- '- '+)
(list '+ '- '- '-)
(list '+ '- '- '*)
(list '+ '- '- '/)
(list '+ '- '* '+)
(list '+ '- '* '-)
(list '+ '- '* '*)
(list '+ '- '* '/)
(list '+ '- '/ '+)
(list '+ '- '/ '-)
(list '+ '- '/ '*)
(list '+ '- '/ '/)
(list '+ '* '+ '+)
(list '+ '* '+ '-)
(list '+ '* '+ '*)
(list '+ '* '+ '/)
(list '+ '* '- '+)
(list '+ '* '- '-)
(list '+ '* '- '*)
(list '+ '* '- '/)
(list '+ '* '* '+)
(list '+ '* '* '-)
(list '+ '* '* '*)
(list '+ '* '* '/)
(list '+ '* '/ '+)
(list '+ '* '/ '-)
(list '+ '* '/ '*)
(list '+ '* '/ '/)
(list '+ '/ '+ '+)
(list '+ '/ '+ '-)
(list '+ '/ '+ '*)
(list '+ '/ '+ '/)
(list '+ '/ '- '+)
(list '+ '/ '- '-)
(list '+ '/ '- '*)
(list '+ '/ '- '/)
(list '+ '/ '* '+)
(list '+ '/ '* '-)
(list '+ '/ '* '*)
(list '+ '/ '* '/)
(list '+ '/ '/ '+)
(list '+ '/ '/ '-)
(list '+ '/ '/ '*)
(list '+ '/ '/ '/)
(list '- '+ '+ '+)
(list '- '+ '+ '-)
(list '- '+ '+ '*)
(list '- '+ '+ '/)
(list '- '+ '- '+)
(list '- '+ '- '-)
(list '- '+ '- '*)
(list '- '+ '- '/)
(list '- '+ '* '+)
(list '- '+ '* '-)
(list '- '+ '* '*)
(list '- '+ '* '/)
(list '- '+ '/ '+)
(list '- '+ '/ '-)
(list '- '+ '/ '*)
(list '- '+ '/ '/)
(list '- '- '+ '+)
(list '- '- '+ '-)
(list '- '- '+ '*)
(list '- '- '+ '/)
(list '- '- '- '+)
(list '- '- '- '-)
(list '- '- '- '*)
(list '- '- '- '/)
(list '- '- '* '+)
(list '- '- '* '-)
(list '- '- '* '*)
(list '- '- '* '/)
(list '- '- '/ '+)
(list '- '- '/ '-)
(list '- '- '/ '*)
(list '- '- '/ '/)
(list '- '* '+ '+)
(list '- '* '+ '-)
(list '- '* '+ '*)
(list '- '* '+ '/)
(list '- '* '- '+)
(list '- '* '- '-)
(list '- '* '- '*)
(list '- '* '- '/)
(list '- '* '* '+)
(list '- '* '* '-)
(list '- '* '* '*)
(list '- '* '* '/)
(list '- '* '/ '+)
(list '- '* '/ '-)
(list '- '* '/ '*)
(list '- '* '/ '/)
(list '- '/ '+ '+)
(list '- '/ '+ '-)
(list '- '/ '+ '*)
(list '- '/ '+ '/)
(list '- '/ '- '+)
(list '- '/ '- '-)
(list '- '/ '- '*)
(list '- '/ '- '/)
(list '- '/ '* '+)
(list '- '/ '* '-)
(list '- '/ '* '*)
(list '- '/ '* '/)
(list '- '/ '/ '+)
(list '- '/ '/ '-)
(list '- '/ '/ '*)
(list '- '/ '/ '/)
(list '* '+ '+ '+)
(list '* '+ '+ '-)
(list '* '+ '+ '*)
(list '* '+ '+ '/)
(list '* '+ '- '+)
(list '* '+ '- '-)
(list '* '+ '- '*)
(list '* '+ '- '/)
(list '* '+ '* '+)
(list '* '+ '* '-)
(list '* '+ '* '*)
(list '* '+ '* '/)
(list '* '+ '/ '+)
(list '* '+ '/ '-)
(list '* '+ '/ '*)
(list '* '+ '/ '/)
(list '* '- '+ '+)
(list '* '- '+ '-)
(list '* '- '+ '*)
(list '* '- '+ '/)
(list '* '- '- '+)
(list '* '- '- '-)
(list '* '- '- '*)
(list '* '- '- '/)
(list '* '- '* '+)
(list '* '- '* '-)
(list '* '- '* '*)
(list '* '- '* '/)
(list '* '- '/ '+)
(list '* '- '/ '-)
(list '* '- '/ '*)
(list '* '- '/ '/)
(list '* '* '+ '+)
(list '* '* '+ '-)
(list '* '* '+ '*)
(list '* '* '+ '/)
(list '* '* '- '+)
(list '* '* '- '-)
(list '* '* '- '*)
(list '* '* '- '/)
(list '* '* '* '+)
(list '* '* '* '-)
(list '* '* '* '*)
(list '* '* '* '/)
(list '* '* '/ '+)
(list '* '* '/ '-)
(list '* '* '/ '*)
(list '* '* '/ '/)
(list '* '/ '+ '+)
(list '* '/ '+ '-)
(list '* '/ '+ '*)
(list '* '/ '+ '/)
(list '* '/ '- '+)
(list '* '/ '- '-)
(list '* '/ '- '*)
(list '* '/ '- '/)
(list '* '/ '* '+)
(list '* '/ '* '-)
(list '* '/ '* '*)
(list '* '/ '* '/)
(list '* '/ '/ '+)
(list '* '/ '/ '-)
(list '* '/ '/ '*)
(list '* '/ '/ '/)
(list '/ '+ '+ '+)
(list '/ '+ '+ '-)
(list '/ '+ '+ '*)
(list '/ '+ '+ '/)
(list '/ '+ '- '+)
(list '/ '+ '- '-)
(list '/ '+ '- '*)
(list '/ '+ '- '/)
(list '/ '+ '* '+)
(list '/ '+ '* '-)
(list '/ '+ '* '*)
(list '/ '+ '* '/)
(list '/ '+ '/ '+)
(list '/ '+ '/ '-)
(list '/ '+ '/ '*)
(list '/ '+ '/ '/)
(list '/ '- '+ '+)
(list '/ '- '+ '-)
(list '/ '- '+ '*)
(list '/ '- '+ '/)
(list '/ '- '- '+)
(list '/ '- '- '-)
(list '/ '- '- '*)
(list '/ '- '- '/)
(list '/ '- '* '+)
(list '/ '- '* '-)
(list '/ '- '* '*)
(list '/ '- '* '/)
(list '/ '- '/ '+)
(list '/ '- '/ '-)
(list '/ '- '/ '*)
(list '/ '- '/ '/)
(list '/ '* '+ '+)
(list '/ '* '+ '-)
(list '/ '* '+ '*)
(list '/ '* '+ '/)
(list '/ '* '- '+)
(list '/ '* '- '-)
(list '/ '* '- '*)
(list '/ '* '- '/)
(list '/ '* '* '+)
(list '/ '* '* '-)
(list '/ '* '* '*)
(list '/ '* '* '/)
(list '/ '* '/ '+)
(list '/ '* '/ '-)
(list '/ '* '/ '*)
(list '/ '* '/ '/)
(list '/ '/ '+ '+)
(list '/ '/ '+ '-)
(list '/ '/ '+ '*)
(list '/ '/ '+ '/)
(list '/ '/ '- '+)
(list '/ '/ '- '-)
(list '/ '/ '- '*)
(list '/ '/ '- '/)
(list '/ '/ '* '+)
(list '/ '/ '* '-)
(list '/ '/ '* '*)
(list '/ '/ '* '/)
(list '/ '/ '/ '+)
(list '/ '/ '/ '-)
(list '/ '/ '/ '*)
(list '/ '/ '/ '/)))
我找到了一种使用递归调用映射的方法,但它只适用于有限值,所以我想知道是否有一种方法可以使其任意化?使用递归确实可以解决这个问题。甚至不需要调用map之类的函数。以下是我认为可以解决问题的实现:
(define (construct-tuples symbols n)
(if (zero? n)
(list '())
(let ((tuples-n-1 (construct-tuples symbols (sub1 n))))
(for*/list ([tuple tuples-n-1]
[symbol symbols])
(cons symbol tuple)))))
此解决方案通过递归工作。基本大小写返回一个包含一个空列表的列表。对于每个迭代,我们得到n-1的可能元组列表,然后对于每个符号,创建一个新列表,包含原始列表和该符号
为说明这是如何工作的,请考虑以下内容:
- 我们要计算
(构造元组'(+-)3)
- 这首先需要计算
(构造元组“(+-)2)
- 需要计算
(构造元组'(+-)1)
- 需要计算
(构造元组'(+-)0)
- 。。。答案是
(list'())
- 对于
中的每个符号,我们创建一个新列表,将该符号附加到'(+-)
中。这将返回'()
(列表“(+)”())
- 对于
中的每个符号,创建一个新列表,将该符号附加到(列表'(+)'()中的每个列表中。这将创建4个新列表(2x2)<代码>(列出“(+)”(+-)“(+)”(-))'(+-)
- 最后,对于
中的每个符号,为我们从递归迭代中获得的每个列表创建一个新列表(将创建8个列表(4x2))'(+-)
(for*/list ([x '(+ -)]
[y '(* /)])
(list x y))
这将生成'(x-)和'(*/)之间每个可能元组的列表