2010-01-09 3 views
1

J'ai écrit une fonction pour obtenir la valeur maximale d'une liste de listes imbriquées, j'ai la forme générale de la fonction vers le bas à droite; il fonctionne sur des listes plates et des listes imbriquées mais semble échouer lorsqu'il existe des listes imbriquées jumelées.Schéma max sur les sous-listes

Voici mon code:

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

Voici une liste de test qu'il échoue sur: (multi-max '(1 9 83 9 (332 (334) (2 3 4224))))

Je ne sais pas où je vais mal, logiquement, l'aide serait bien !

+0

Ce problème est absolument mendiant pour l'application de la recette de conception (voir http://www.htdp.org/). Plus précisément: quelle est la définition des données pour votre entrée? –

Répondre

3

Je n'a pas détecté l'erreur logique donc je récrire de manière récursive plus :)
Il est important d'identifier les parties récursives première avant d'écrire notre fonction.

multi-max peut être défini récursivement comme 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))))
sorties maintenant 4224.

Edit: Ok, je pense avoir trouvé l'erreur:

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

Le code ne tient pas compte du (cdr array) dans la partie (pair?) et (car array)
dans la partie (else ).

Il devrait être:

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

(*) Notez que le (pair? ) est retiré.

+0

Doh! Merci mec! – Ixmatus