Как рекурсивно проходить список списков и комбинировать списки разными способами

Это продолжение этого вопроса.

У меня есть списки или «записи», которые добавляются вместе в пустой список, каждый из которых имеет формат (Matthew (AL 21 32)). Сейчас я пытаюсь написать функцию, которая использовала бы fetchRecord, чтобы найти нужную запись, а затем умножить два числа внутри записи. Однако мой текущий код работает только в том случае, если я получаю имя в первой записи, но после этого он возвращает пустой список для любой записи. Вот мой код:

(define (Mult_Num name)
  (cond
    [(empty? db) #f]
    [else (* (car(cdr(car(cdr (fetchRecord name)))))
             (car(cdr(cdr(car(cdr (fetchRecord name)))))))]))

Как мне это исправить? Кроме того, если в определенной записи есть два набора данных, например: (John (AL 25 40) (CA 40 67)), то как вы получите как 25 * 40, так и 40 * 67 и т. Д., И даже если у нее более двух наборов данных? Я понимаю, что это будет рекурсия, но не совсем уверен, как вы ее настроите.

Это моя функция fetchRecord:

(define (fetchRecord name)
  (cond
    [(empty? db) #f]
    [(equal? (car (car db)) name) (car db)]
    [else( car (car db)) name (cdr db)]))

Это также может иметь значение:

(define db '())

Также у меня есть это, но если у меня здесь больше двух имен, оно само закручивается:

 (define(showRec name) ;displays everything following a name. 
  (cond
    [(empty? db) #f]
    [(equal? (car (car db)) name) (cdr (fetchRecord name))]
    [else (cdr (car(fetchRecord name)))])
  )

person Mkodamore    schedule 26.09.2016    source источник
comment
Рекурсии нет, если функция (в данном случае Bill_Amt) не вызывает сама себя.   -  person Scott Hunter    schedule 26.09.2016
comment
@ScottHunter Я пытаюсь выяснить, что не так, прежде чем я смогу начать рекурсию, потому что она будет продолжать выдавать ошибки.   -  person Mkodamore    schedule 26.09.2016
comment
Пожалуйста, прочитайте справку по Как создать минимальный, полный и проверяемый пример, так как ваш вопрос, как и сейчас, неясен. .   -  person Renzo    schedule 26.09.2016
comment
Привет, в соответствии с рекомендациями SO вы должны опубликовать свой код, свою последовательность вызовов функций (то есть программу), ее вывод/сообщение об ошибке и описать свой желаемый вывод. Иными словами, вопросы здесь должны быть конкретными и конкретными. Вроде как, если я вызываю это, я получаю это, но я ожидал это . Лучше всего копировать и вставлять фрагменты расшифровки REPL (то есть интерактивной подсказки) в точности как есть. Или используйте Ideone.com.   -  person Will Ness    schedule 26.09.2016


Ответы (1)


Основная проблема заключается в том, что вы полагаетесь на fetchRecord, который не только не работает, но и недействителен. Схема: предложение else должно иметь только 1 аргумент, а не 3.

И вас не должно удивлять, что функция, которая использует рекурсию для обработки rest списка, не обрабатывает rest списка, если она не использует рекурсию.

person Scott Hunter    schedule 26.09.2016