Схема макс по подспискам - PullRequest
1 голос
/ 09 января 2010

Я написал функцию, чтобы получить максимальное значение из списка вложенных списков, у меня есть общая форма функции внизу справа; он работает с плоскими списками и вложенными списками, но, похоже, не работает, если есть вложенные списки одного и того же типа.

Вот мой код:

(define (multi-max array)
  (cond
    ((null? array) 0)
    ((number? (car array))
      (if (> (car array) (multi-max (cdr array)))
       (car array)
       (multi-max (cdr array))))
    ((pair? (car array))
     (multi-max (car array)))
    (else
     (multi-max (cdr array)))))

Вот список тестов, на котором он не работает: (multi-max '(1 9 83 9 (332 (334) (2 3 4224))))

Я не уверен, где я иду не так, логически, некоторая помощь была бы хороша!

1 Ответ

3 голосов
/ 09 января 2010

Я не обнаружил логическую ошибку, поэтому переписал ее рекурсивным способом more Важно идентифицировать рекурсивные части, прежде чем писать нашу функцию.

multi-max может быть рекурсивно определен как multi-max = max(multi-max(car), multi-max(cdr))

(define (multi-max array)
  (cond ((pair? array) (max (multi-max (car array)) (multi-max (cdr array))))
        ((number? array) array)
        (else 0)))

(multi-max '(1 9 83 9 (332 (334) (2 3 4224))))
теперь выводит 4224.

Редактировать: Хорошо, думаю, я нашел ошибку:

...
((pair? (car array))
 (multi-max (car array)))
(else
 (multi-max (cdr array))))
...

Код игнорирует (cdr array) в (pair? ) части и (car array)
в части (else )

Должно быть:

(else (max (multi-max (car array)) (multi-max (cdr array))))

(*) обратите внимание, что (pair? ) удалено.

...