在球拍中使用lambda进行迭代?

Mic*_*ski 1 lisp lambda scheme racket

这可能是一个简单的问题,但我似乎无法弄明白.在下面的示例中,我想创建一个list-of-obj递归创建项列表的函数.

例:

> (list-of-obj 'a 5)
'(a a a a a)
Run Code Online (Sandbox Code Playgroud)

代码:

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

然而,这导致输出0.有什么指针吗?我是球拍/计划的新手.

Ósc*_*pez 5

Racket中最惯用的解决方案是:

(make-list 5 'a)
=> '(a a a a a)
Run Code Online (Sandbox Code Playgroud)

也就是说,如果内置函数执行您想要的操作,则不应重新发明轮子.但如果你需要从头开始编写,这应该可以解决问题:

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

您的代码存在两个问题:

  • 呼叫helper必须被包围(),因为这就是你如何调用Scheme中的过程.
  • 累加器的初始值必须是一个空列表,因为我们正在构建一个列表作为输出,而不是0像你一样.