0

コード「tsFunc」は入力として 2 つのリストを取得し、2 つのリストの各要素をペアにします。ほとんどの場合に機能します。しかし、2つの等しい長さのリストを与えると、少し奇妙な動作が見つかります(たとえば、 '(1 2) '(3 4).... または '(abc) '(1 2 3).... 、それは機能しますまず、ここにコードがあります。

【問題1】

(define (tsFunc lst1 lst2)
 (define (helper ls1 ls2 rst)  
  (reverse (if (or (null? ls1) (null? ls2))                          
      rst                                                   
      (helper (cdr ls1) (cdr ls2)               
                (cons (cons (car ls1) (car ls2)) rst)))))
(helper lst1 lst2 '()))

このような動作:

1) リストの長さが不均一な場合の正しい動作: (tsFunc '(1 2 3) '(ab)) ====> 出力: ((1 . a) (2 . b))

2) リストの長さが偶数の場合の奇妙な動作: (tsFunc '(1 2 3) '(abc)) ===> 出力 (間違った): ((3 . c) (2 . b) (1 . a)) = ==> 予想: ((1 . a) (2 . b) (3 . c))

2 つの入力リストが同じ長さの場合、何が起こっているのでしょうか? tsFunc ロジックは、同じ長さの入力リストと異なる長さの入力リストの間で異なる動作をしますか? (注。私が知っているように、コードには最終結果のために「逆」が必要です。したがって、コードの「逆」が原因ではありません)

[問題 2] tsFunc => tsFunc result: (1 . 2) (3 . 4) => の結果で (1*2)+(3*4) = 14 のような製品を実装しようとすると、次のようになります。これ..

(define (func l1 l2)
 (tsFunc (l1 l2)                              ;; line 2 - how to call tsFunc's result??
  (foldl (lambda (acc pair)                   ;; line 3
       (+ acc (* (car pair) (cdr pair))))     ;; line 4
     '()
     l1 l2)))                                 ;; like this?? or ??

行 3 、 4 わかりました..これが何をすべきかのロジックです。それから、tsFunc の結果を呼び出してそれを入力として使用する方法と..最後の行の 2 つのリスト..不明..

4

2 に答える 2

3

最初の問題は、反復ごとにリストを逆にし続けることです。本当に出力を逆にする必要がある場合は、最後に一度だけ実行してください。

(define (tsFunc lst1 lst2)
  (define (helper ls1 ls2 rst)
    (if (or (null? ls1) (null? ls2))
        (reverse rst)
        (helper (cdr ls1) (cdr ls2)
                (cons (cons (car ls1) (car ls2)) rst))))
  (helper lst1 lst2 '()))

さて、2 番目の問題について - コードはコンパイルさえしません。tsFuncプロシージャを正しく呼び出しておらず、間違った場所で呼び出しています。また、アキュムレータ パラメータの初期値が間違っています。数値を返す場合は、リストを使用できません。

(define (func l1 l2)
  (foldl (lambda (acc pair)
           (+ acc (* (car pair) (cdr pair))))
         0
         (tsFunc l1 l2)))

質問のサンプル入力を使用すると、次のようになります。

(func '(1 3) '(2 4))
=> 14

上記では、 とを入力としてtsFunc取り、それらを に変換してから、期待どおりに操作を実行します。'(1 3)'(2 4)'((1 . 2) (3 . 4))foldl(1*2)+(3*4) = 14

于 2014-05-15T15:21:05.650 に答える
0

高階関数の使用が許可されているのに、なぜSRFI-1 List ライブラリ foldだけを使用しないのですか?

#!r6rs

(import (rnrs base)
        (only (srfi :1) fold)) ;; srfi-1 fold stop at the shortest list 

(define (func lst1 lst2)
  (fold (lambda (x y acc)
          (+ acc (* x y)))
        0
        lst1
        lst2))


(func '(1 3) '(2 4 8)) ; ==> 14
于 2014-05-15T23:13:52.057 に答える