构建2D列表

Dav*_*vid 0 scheme list racket

寻找一个类似于以下内容的函数:

   (foo 3 2) => '( ( (1 1) (1 2) (1 3) )
                   ( (2 1) (2 2) (2 3) ) )
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*lay 5

在Racket中用于获取此类内容的主要工具是各种for循环.假设您要创建基于列表的矩阵结构,那么这是获取它的一种方法:

#lang racket
(define (foo x y)
  (for/list ([i y])
    (for/list ([j x])
      (list (add1 i) (add1 j)))))
Run Code Online (Sandbox Code Playgroud)

而且由于人们提出了如何foo创建任何维度的矩阵的更一般的问题,这里是一个适用于任意数量的参数的通用版本,并且在调用时仍然返回相同的结果(foo 3 2):

#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))))))
Run Code Online (Sandbox Code Playgroud)

(注意BTW,在这两种情况下,我都使用简单的基于0的迭代,并用来add1获得你想要的数字.另一种方法是替换

(for/list ([i x]) ... (add1 i) ...)
Run Code Online (Sandbox Code Playgroud)

(for/list ([i (in-range 1 (add1 x)]) ... i ...)
Run Code Online (Sandbox Code Playgroud)

)