-1

連想リストを返す 2 つの関数があるとします。1 つは各人が持っているボトルの合計量を示し、もう 1 つはそれを取得するのにかかった日数を示します。2 つのリストの平均をとってリストを結合するにはどうすればよいですか? 与えられた

(define (lookup k alst)
  (cond [(empty? alst)
         empty]
        [(equal? k (first (first alst)))
         (second (first alst))]
        [else 
         (lookup k (rest alst))]))

(define (put k v alst)
  (cond [(empty? alst)
         (list (list k v))]
        [(equal? k (first (first alst)))
         (cons (list k v) (rest alst))]
        [else
         (cons (first alst) 
               (put k v (rest alst)))]))

つまり、関数(total-bottles lst)が戻り '((bob 10) (tim 30) (sally 25))

(days-taken lst)戻るだろう '((bob 2) (tim 3) (sally 5))

この結果を返すために、毎日平均して収集されたボトルの量を返す 1 日あたりの平均ボトル数関数のリストを結合する関数を作成するにはどうすればよいですか? (average lst) '((bob 5) (tim 10) (sally 5))?

4

2 に答える 2

1

両方のリストに同じ人物が同じ順序で含まれている場合は、@JhonClements の提案に従って、HtDP のレシピを見てください。アイデアを提供するために、ソリューションの一般的な構造を次に示します。空白を埋めます。

(define (average l1 l2)
  (if <???>                   ; if one of the lists is null
      <???>                   ; return null
      (cons (list             ; else cons a new 2-element list, its first element
             <???>            ; is the name in the current position in either list
             (/ <???> <???>)) ; and calculate the average between current elements
            (average <???> <???>)))) ; finally, advance recursion over both lists

リストの 1 つが null であるかどうかを判断し、人物の名前を選択するために、どのリストを使用しても問題ないことに注意してください。ポジション。ただし、平均を計算するには、各リストの現在の要素を考慮する必要があります。完了したら、ソリューションをテストすることを忘れないでください。

(average (total-bottles lst)
         (days-taken lst))

=> '((bob 5) (tim 10) (sally 5))
于 2013-03-05T01:02:01.870 に答える
1

あなたが示唆するように、リストが同じ順序であり、まったく同じ人が含まれている場合は、HtDP のセクション 17.2、「2 つのリストを同時に処理する」のケース 2 を参照することをお勧めします。まさにこの種の問題がたくさんあります。

これがクラス関連の質問でない場合は、お知らせください。

于 2013-03-05T00:30:15.137 に答える