2016-07-05 93 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