2016-07-05 55 views
1

这可能是一个简单的问题,但我似乎无法弄清楚。 在下面的例子中,我想创建一个递归创建项目列表的函数list-of-obj与lambda在球拍迭代?

实施例:

> (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输出。任何指针?我是新来的球拍/计划。

回答

5

球拍最惯用的解决办法是:

(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