1

リストをコピーするヘルパーがあります:

(define (list-copy list)
  (if (null? list)
      '()
      (cons (car list) (list-copy (cdr list)))))

それで、

(define (multList lst1 lst2)
  (define lstCopy2 (list-copy lst2))  
  (cond ((null? lst1) ())
        ((eq? (length lst1) (length lst2)) (cons (* (car lst1) (car lst2)) (multList (cdr lst1) (cdr lst2)))) 
        ((> (length lst1) (length lst2))
         (if (null? lst2) lstCopy2
         (cons (* (car lst1) (car lst2)) (multList (cdr lst1) (cdr lst2)))))
        (else '())))

lst2 を lstCopy2 にコピーしようとしていますが、lst2 を (lstCopy2 の助けを借りて) 呼び出すために lst2 で作業しているときに、最初と同じように lstCopy2 をそのままにしておきたいと思います。私の3番目の条件(長さlst1>長さlst2の場合)lst2 =()の場合、lst1が()になるまでプロセスを続行したいと思います。

ご協力いただきありがとうございます

4

2 に答える 2

2

私が見る限り、あなたのコピーは使用されていません。さらに、どの手順も何も変更しないため、リストのすべての再帰/要素に対して(equal? lst2 lstCopy2)常に変更されます。#t

lst1がリストの最後より短い場合、またはlst2リストの最後に到達した場合、()は不正な式であるため、エラーが発生します。おそらくあなたが意味したの'()ですか?

これはもっと簡単に書くことができたでしょう:

(require srfi/1)

(define (multList lst1 lst2)
  (define (aux lst1 lst2)
    (if (null? lst2)
        '()
        (cons (* (car lst1) 
                 (car lst2)) 
              (aux (cdr lst1) (cdr lst2)))))
  (aux (apply circular-list lst1) lst2))

(multList '(1 -1) '(1 2 3 4 5 6)) ; ==> (1 -2 3 -4 5 -6)

;; with srfi-1-version of map we can use it to make the code shorter
(define (multList lst1 lst2)
  (map * (apply circular-list lst1) lst2))
于 2013-10-26T16:02:37.330 に答える