构建2D列表

时间:2011-11-26 01:22:48

标签: list scheme racket

寻找类似于以下内容的功能:

   (foo 3 2) => '( ( (1 1) (1 2) (1 3) )
                   ( (2 1) (2 2) (2 3) ) )

DrRacket中是否有任何内置函数可以实现这一功能?

4 个答案:

答案 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)))))))