2017-02-15 17 views
0

リストにカッコを追加するにはどうすればよいですか?例えば、リストにa()を追加するにはどうすればよいですか?

(乗算 '(1 2)'(1 2 3))

それべき出力これは私が今持っているものである

((1 2 3)(2 4 6))

(define multiply 
    (lambda (los1 los2) 
    (cond 
    ((null? los1) '()) 
    ((null? los2) '()) 
    (else (cons (* (car los1) (car los2)) 
     (append (multiply(list (car los1)) (cdr los2)) 
      (multiply(cdr los1) los2))))))) 

出力は(1 2 3 2 4 6)です。

P/S:これは悪い質問か何かであれば、私に教えたり、私を叱ることを躊躇しません。私はstackoverflowを使用する方法を学びたいと思っています。

答えて

1

は、入力と出力の意味が何であるかを考えてみてください。私はあなたが1回の再帰的な手順でこれを行うことはできないと想像していますが、あなたは2回でこれを行うことができます。

(list-multiply 5 '(1 2 3)) 
; ==> (5 10 15) 

あなたが最初のリストを反復処理し、各要素のlist-multiplyを使用することを持って、そしてもちろんの第二引数が繰り返されることはありません、それはちょうどに沿って渡されています。

(multiply '(1 2) '(1 2 3)) 
; ==> (cons (list-multiply 1 '(1 2 3)) 
;   (cons (list-multiply 2 '(1 2 3)) 
;     '())) 
; ==> ((1 2 3) (2 4 6)) 

あなたは、単に高階関数をuseinfgことでこれを実装することができます

(define (multiply lst1 lst2) 
    (map (lambda (e1) 
     (map (lambda (e2) (* e1 e2)) lst2)) 
     lst1)) 

は、二重mapに注意してください。リストの各要素と一つの要素を乗算し、その結果の要素を作るためにlst1を反復処理し、第二map一つ。これらの見た目が似ているので、2つの再帰関数にはおそらく共通点が多いと想像してもよいでしょう。

PS:listappendせずにあなたの問題を解決することを学びます。 (list 1 2 3)(cons 1 (cons 2 (cons 3 '())))に相当し、(append '(1 2 3) '(4 5 6))(cons 1 (cons 2 (cons 3 '(4 5 6))))と同等であるだけの手順です。常に先頭に端からリストを構築し、イベントであなたはそれだけで終わりでreverseが必要になる場合があります反対を必要としてみてください。

関連する問題