2017-11-12 11 views
0

私はラケット言語を使用していますが、再帰関数のためにいくつかの問題が発生することがあります。私の目標は、整数nを入力し、その要素をリストとしてn回出力することです。 racketは2つの関数を再帰的に追加します

は、テキスト、ます#langラケット「除外」

; take n (integer) e (scheme) build new list  
; 2 `() ->()()  
; 3 `a -> a a a  
; 4 `(a) -> (a) (a) (a) (a) 

(define (list n e)  
    (if (= n 0) e  
     (append e(list (- n 1) e)))) 

; (list 0 '()) 
; prints '() 
; (list 2 '()) 
; should print '() '() 

答えて

1
あなたの問題は appendはあなたにそれを期待している何をやっていないことであるように思われる

- それはアンラップと破棄トップレベルの空リスト。 (例えば、(append '(1) '() '(2) '() '(3)) ;; => '(1 2 3))。

したがって、appendの場合、consをスワップすると、期待される出力が得られます。

(define (my-list n empty-list)  
    (if (= n 0) 
     empty-list  
     (cons 
     empty-list 
     (my-list (- n 1) empty-list)))) 

(my-list 2 '()) ;; => '(()()) 

また、ラケットの組み込みのlist機能を再考する必要があります。

This answerは、appendが内部で何を行っているか、そしてなぜこのシナリオでは望ましくないのかについての有用な内訳があります。

関連する問題