2011-02-26 6 views
1

L'affectation consiste à définir une fonction qui accepte une seule liste en tant que paramètre et affiche la valeur maximale de la liste. J'ai l'impression que mes «ifs» et «lets» imbriqués sont très excessifs et que la fonction se termine prématurément sans imprimer de réponse. J'ai cherché un exemple d'utilisation de laisser récursivement avec la récursivité, mais sont apparus vides, les fonctionnalités de débogage dans DrRacket ne sont pas très utiles pour tracer via un appel récursif.Fonction Scheme Max (récursion)

Toute aide est appréciée, merci.

(define max 
(lambda (x) 
    (let ((y (car x))) 
    (if (null? (cdr x)) 
     y 
     (let ((m (max(cdr x)))) 
      (if (> m y) 
       m 
       y) 
    ))))) 

Répondre

2

Je vois quelques bugs dans votre code: tout d'abord, (null? (cadr x)) est de type correcte non; x est une liste de nombres, et donc (cadr x) est un nombre, qui ne sera jamais nul. En outre, vous n'utilisez pas y après la deuxième fois il est lié avec let. Pourriez-vous essayer de décrire en anglais ce que devrait faire une fonction max sur les listes?

+0

Bien sûr, la fonction max prend une liste de nombres en entrée et renvoie la valeur du nombre dans la liste qui est la plus grande. Ce que j'ai essayé de faire est d'assigner la première valeur au maximum ("y") en utilisant let, puis de parcourir successivement chaque valeur et de la comparer à la valeur maximale actuelle. Si c'est plus grand, ("y") prend une nouvelle valeur. J'ai supposé que (cadr x) renverrait null s'il n'y avait pas d'autres valeurs; utiliserait plutôt l'utilisation (cdr x) cause le même problème? –

+0

@Decency: Oui, vous devriez utiliser '(cdr x)' dans le test. Que pensez-vous que devrait être fait avec la réponse de l'appel récursif (c'est-à-dire, en supposant que vous ayez une paire '(x .z)', que faire avec '(max z)')? –

+0

Je ne suis pas sûr de ce que vous voulez dire par la paire, mais je vais essayer de répondre. Je veux que la réponse de l'appel récursif soit transmise et comparée à chacune (voiture x) qui a été prise de façon récursive au cours du programme. Je ne suis pas sûr si la portée de y va me laisser faire cela, et si c'est le cas, comment le faire. Je me rends compte que je regarde cela comme essentiellement une boucle do-while mais je ne sais pas si c'est la bonne approche pour ce langage. –