在球拍中与lambda迭代?

在球拍中与lambda迭代?,lambda,scheme,lisp,racket,Lambda,Scheme,Lisp,Racket,这可能是一个简单的问题,但我似乎无法理解。 在下面的示例中,我想创建一个obj函数列表,它递归地创建一个项目列表 例如: > (list-of-obj 'a 5) '(a a a a a) 守则: #lang racket (define (list-of-obj obj n) (letrec ((helper (lambda (obj n result) (if (> n 0) (helper ob

这可能是一个简单的问题,但我似乎无法理解。 在下面的示例中,我想创建一个obj函数列表,它递归地创建一个项目列表

例如:

> (list-of-obj 'a 5)
'(a a a a a)
守则:

#lang racket
(define (list-of-obj obj n)
  (letrec ((helper
           (lambda (obj n result)
             (if (> n 0)
               (helper obj (- n 1) (cons obj result))
               result))))
      helper obj n 0))

然而,这将导致输出为0。有什么建议吗?我不熟悉racket/scheme。

racket中最常用的解决方案是:

(make-list 5 'a)
=> '(a a a a a)
也就是说,如果内置函数满足您的需要,您不应该重新发明轮子。但如果您需要从头开始编写,这应该可以做到:

(define (list-of-obj obj n)
  (letrec ((helper
            (lambda (obj n result)
              (if (> n 0)
                  (helper obj (- n 1) (cons obj result))
                  result))))
    (helper obj n '())))
您的代码有两个问题:

对helper的调用必须被包围,因为这是在Scheme中调用过程的方式。 累加器的初始值必须是一个空列表,因为我们正在构建一个列表作为输出,而不是一个0。
Racket中最惯用的解决方案是:

(make-list 5 'a)
=> '(a a a a a)
也就是说,如果内置函数满足您的需要,您不应该重新发明轮子。但如果您需要从头开始编写,这应该可以做到:

(define (list-of-obj obj n)
  (letrec ((helper
            (lambda (obj n result)
              (if (> n 0)
                  (helper obj (- n 1) (cons obj result))
                  result))))
    (helper obj n '())))
您的代码有两个问题:

对helper的调用必须被包围,因为这是在Scheme中调用过程的方式。 累加器的初始值必须是一个空列表,因为我们正在构建一个列表作为输出,而不是一个0。