寻找类似于以下内容的功能:
(foo 3 2) => '( ( (1 1) (1 2) (1 3) )
( (2 1) (2 2) (2 3) ) )
DrRacket中是否有任何内置函数可以实现这一功能?
答案 0 :(得分:5)
在Racket中用于获取此类内容的主要工具是各种for
循环。假设您要创建基于列表的矩阵结构,那么这是获取它的一种方法:
#lang racket
(define (foo x y)
(for/list ([i y])
(for/list ([j x])
(list (add1 i) (add1 j)))))
由于人们提出了如何使foo
创建任何维度的矩阵的更一般的问题,这里是一个适用于任意数量的参数的通用版本,并且当被称为{{时仍然返回相同的结果1}}:
(foo 3 2)
(请注意,在这两种情况下,我都使用简单的基于0的迭代,并使用#lang racket
(define (foo . xs)
(let loop ([xs (reverse xs)] [r '()])
(if (null? xs)
(reverse r)
(for/list ([i (car xs)])
(loop (cdr xs) (cons (add1 i) r))))))
来获取您想要的数字。另一种方法是替换
add1
与
(for/list ([i x]) ... (add1 i) ...)
)
答案 1 :(得分:0)
代码:
(define (foo-makey const max data)
(let* ((i (length data))
(newy (- max i))
(newpair (cons const newy)))
(if (= max i)
data
(foo-makey const max
(cons newpair data)))))
(define (foo-makex xmax ymax data)
(let* ((i (length data))
(newx (- xmax i)))
(if (= xmax i)
data
(foo-makex xmax ymax
(cons (foo-makey newx ymax '()) data)))))
(define (foo x y)
(foo-makex y x '()))
输出:
> (foo 3 2)
'(((1 . 1) (1 . 2) (1 . 3)) ((2 . 1) (2 . 2) (2 . 3)))
答案 2 :(得分:0)
我无法按原样回答您的问题,因为我不明白嵌套列表应如何用于> 2参数。 AFAIK没有内置功能来做你想做的事。
为了让您开始,这里有一些代码可以生成输出而不用嵌套列表。作为练习尝试调整代码以执行嵌套列表。看看是否有办法可以提高代码效率。
;;can take in any number of arguments
(define (permutations . nums)
(foldl
(lambda (current-num acc)
(append-map
(lambda (list-in-acc)
(for/list ((i (build-list current-num (curry + 1))))
(append list-in-acc (list i))))
acc))
(list (list))
(reverse nums)))
示例1:
> (permutations 3 2)
'((1 1) (1 2) (1 3) (2 1) (2 2) (2 3))
示例2:
> (permutations 10)
'((1) (2) (3) (4) (5) (6) (7) (8) (9) (10))
示例3:
> (permutations 2 3 4)
'((1 1 1)
(1 1 2)
(1 2 1)
(1 2 2)
(1 3 1)
(1 3 2)
(2 1 1)
(2 1 2)
(2 2 1)
(2 2 2)
(2 3 1)
(2 3 2)
(3 1 1)
(3 1 2)
(3 2 1)
(3 2 2)
(3 3 1)
(3 3 2)
(4 1 1)
(4 1 2)
(4 2 1)
(4 2 2)
(4 3 1)
(4 3 2))
答案 3 :(得分:0)
(define(build-2d row col) (构建列表行(lambda(x)(构建列表col(lambda(y)(列表(+ x 1)(+ y 1)))))))