2013-03-04 5 views
-1

Скажем, у меня есть две функции, которые возвращают списки ассоциаций, в которых вы даете общее количество бутылок, которые есть у каждого человека, и другое, которое дает количество дней, которое требуется для их получения. Как объединить списки, взяв среднее из двух списков? Учитываядве схемы списков ассоциаций

(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))

как бы я сделать функцию, чтобы объединить списки в среднем- функция бутылок в день, которая возвращала бы количество бутылок, собранных в среднем каждый день, чтобы вернуть этот результат? (average lst) '((bob 5) (tim 10) (sally 5))?

+1

У обоих списков есть точно такие же лица? являются ли лица в точно таком же порядке в обоих списках? –

+0

да, они в точном порядке и те же люди – user1869703

ответ

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 

Обратите внимание, что для определения, если один из списков является нулевым и для выбора имени человека, его не имеет значения, какой список вы используете, потому что мы предположили, что списки имеют одинаковую длину и одни и те же люди в тех же позициях. Тем не менее, для вычисления среднего вам нужно рассмотреть текущий элемент в каждый. Как только вы закончите, не забудьте проверить свое решение:

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

=> '((bob 5) (tim 10) (sally 5)) 
+0

Как получить имя или номер из списка списков? Я действительно не понимаю, как я могу это сделать из списка. Как и у части (минус (список <...> (/ )), как бы я мог получить имя и номер из списка многих других списков? Было бы (cons (list (first (first l1)) (/ (второй (первый l1) (второй (первый l2))) – user1869703

+0

@ user1869703 вы почти получили его, там есть несколько неуместных круглых скобок, но вы на правильном пути. Продолжайте пытаться немного больше, и вы получите это все в порядке! –

+0

(определить (среднее l1 l2) (если (или (нуль? l1) (нуль? l2)) нулевые (конс (список (первая (первая l1)) (/ (второй (первый l1)) (второй (первый l2)))) (в среднем (остаток l1) (остаток l2))))) - это то, с чем я закончил, и это orked с моим тестом. Это верно? – user1869703

1

Если, как вы полагаете, списки находятся в одном порядке и содержат ровно одни и те же люди, то я предлагаю вам взглянуть на section 17.2 of HtDP, Случай 2 «Обработка двух списков одновременно». У этого есть куча проблем такого рода.

Если это не вопрос, связанный с классом, то дайте мне знать.

+0

Я его прочитал, но я не уверен, как применить это к списку списков. Это для класса, но я застрял здесь довольно долго, около двух часов или около того, поэтому я решил задать этот вопрос. – user1869703

Смежные вопросы