2016-07-05 6 views
1

これはおそらく簡単な質問ですが、わかりません。 以下の例では、項目のリストを再帰的に作成する関数list-of-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の出力をもたらします。すべてのポインタ?私はラケット/スキームには新しいです。

答えて

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のようにはなりません。