4

数学で説明します。Schemeコードを書くのに苦労している変換は次のとおりです。

(f '(a b c) '(d e f)) = '(ad (+ bd ae) (+ cd be af) (+ ce bf) cf)

2つの文字が一緒にあるようなad意味(* a d)です。

私は純粋関数型の方法でそれを書き込もうとしていますが、その方法を理解するのに苦労しています。任意の提案をいただければ幸いです。

ここではいくつかの例を示します。

(1mul '(0 1) '(0 1)) = '(0 0 1)
(1mul '(1 2 3) '(1 1)) = '(1 3 5 3)
(1mul '(1 2 3) '(1 2)) = '(1 4 7 6)
(1mul '(1 2 3) '(2 1)) = '(2 5 8 3)
(1mul '(1 2 3) '(2 2)) = '(2 6 10 6)
(1mul '(5 5 5) '(1 1)) = '(5 10 10 5)
(1mul '(0 0 1) '(2 5)) = '(0 0 2 5)
(1mul '(1 1 2 3) '(2 5)) = '(2 7 9 16 15)

したがって、パターンは最初に投稿したもののようです。

リストの最初の数字に2番目のリストのすべての数字(ad、ae、af)を掛けてから、続けて(bd、be、bf、cd、ce、cf)、数字を「なんとかして」並べて、対応する数字を追加します。値。私がそれをオーバーラップと呼ぶ理由は、次のように視覚化できるからです。

(list
       aa'
    (+ ba' ab')
    (+ ca' bb' ac')
        (+ cb' bc')
               cc')

また、

(f '(a b c) '(d e f)) = '(ad (+ bd ae) (+ cd be af) (+ ce bf) cf)

ただし、3x3リストだけでなく、任意のサイズのリストの場合。

4

3 に答える 3

1

これが私のコードです。ラケットに入っています

#lang racket

(define (drop n xs)
  (cond [(<= n 0) xs]
        [(empty? xs) '()]
        [else (drop (sub1 n) (rest xs))]))        

(define (take n xs)
  (cond [(<= n 0) '()]
        [(empty? xs) '()]
        [else (cons (first xs) (take (sub1 n) (rest xs)))]))        


(define (mult as bs)
  (define (*- a b)
    (list '* a b))
  (define degree (length as))
  (append 
   (for/list ([i  (in-range 1 (+ 1 degree))])
     (cons '+ (map *- (take i as) (reverse (take i bs)))))
   (for/list ([i  (in-range 1 degree)])
     (cons '+ (map *- (drop i as) (reverse (drop i bs)))))))

for/list、数値のリストをマッピングし、結果をリストに収集するための単なる方法です。必要に応じて、マップだけで再定式化できます。

于 2013-05-21T13:16:14.300 に答える
0

これは再帰の良い候補ですか?確かではありませんが、ここにあなたが求めたものの直訳があります。

(define (f abc def)
  (let ((a (car abc)) (b (cadr abc)) (c (caddr abc))
        (d (car def)) (e (cadr def)) (f (caddr def)))
    (list (* a d)
          (+ (* b d) (* a e))
          (+ (* c d) (* b e) (* a f))
          (+ (* c e) (* b f))
          (* c f))))
于 2013-01-23T07:51:28.453 に答える
0

この計算を実行したいと仮定するのは正しいですか?

(a+b+c)*(d+e+f) = a(d+e+f) + b(d+e+f) + c(d+e+f) 
                = ad+ae+af + bd+be+bf + cd+ce+cf

もしそうなら、これは簡単です:

(define (f xs ys)
   (* (apply + xs) (apply + ys))

シンボリックバージョンに興味がある場合:

#lang racket
(define (f xs ys)
  (define (fx x)
    (define (fxy y)
      (list '* x y))
    (cons '+ (map fxy ys)))
  (cons '+ (map fx xs)))

そしてここにテストがあります:

> (f '(a b c) '(d e f))
'(+ (+ (* a d) (* a e) (* a f)) 
    (+ (* b d) (* b e) (* b f)) 
    (+ (* c d) (* c e) (* c f)))
于 2013-01-23T13:18:34.230 に答える