2012-11-11 3 views
3

Je dois créer ce qui suit: Une procédure de schéma nommée 'proc2' qui prend 4 nombres comme arguments et renvoie la valeur du plus grand argument moins le plus petit.Utilisation de conditions dans le schéma

Je veux écrire (définir PROC2 lambda (ABCD) ... )

Est-il possible que je peux évaluer (> ab), (> ac), (> ad) à le même temps? Je veux obtenir le plus grand (et le plus petit) nombre sans avoir à écrire des ifs imbriqués.

Répondre

0

Pouvez-vous utiliser les procédures max et min? si la réponse est oui, il est assez simple:

(- (max a b c d) (min a b c d)) 

Sinon, rappelez-vous que <, >, <=, >= acceptent un nombre variable d'arguments, de sorte que ce code est valide et vous dira si a est plus petit que b et b est plus petit que c et c est plus petit que d (bien que vous devrez tester plusieurs combinaisons de b, c, d pour vous assurer que a est la plus petite valeur).

(< a b c d) 

Rappelez-vous aussi de tenir compte des cas où deux ou plusieurs numéros sont égaux (c'est pourquoi il est une bonne idée d'utiliser <= au lieu de <).

De toute façon, vous devrez utiliser des conditions. Peut-être imbriqué if s, ou peut-être un cond pour rendre les choses plus simples - vous pouvez travailler sur les détails vous-même, je suppose que c'est devoirs.

+0

"... vous dire si a est le plus petit nombre ..." Non, ce ne sera pas le cas. +1 pour le min/max, -1 pour la deuxième partie. Hu. – Dirk

+0

@Dirk J'ai édité ma réponse –

+0

Un désordre de ( itsbruce

0

Si vous voulez trouver les plus petits et les plus grands membres de la liste et vous n'êtes pas autorisé à utiliser la norme min et fonctions de bibliothèque max, je peux penser à trois approches

  1. Ecrire vos propres fonctions min et max (indice: récursion). Appliquez les deux à la liste pour trouver vos deux valeurs. Effectuez la soustraction.
  2. Ecrivez une fonction combinée (encore une fois, récursive) qui passera une fois dans la liste, en retournant une autre liste de deux membres qui contient les valeurs max et min. Si le premier élément de la liste retournée est le maximum, alors (apply - (find-min-and-max 3 2 8 7)), où find-min-et-max est votre fonction, retournera le résultat de la soustraction.
  3. Utilisez carte.

L'option 1 est moins efficace que l'option 2, mais beaucoup plus simple à écrire. L'option 3 est plus complexe que, mais ne fait ce que vous avez demandé (à savoir comparer un à b, c et d « en même temps »).

Par exemple, si je définissais la fonction suivante:

(define (compare test x l) 
    (map (lambda (y) (test x y)) l)) 

puis

(compare < 3 '(1 2 4)) 

retournerait (#f #f #t)

Comment est-ce utile pour vous? Eh bien, si (compare < x l) retourne vrai, alors x est plus petit que tous les éléments de l . Si elle retourne tout faux, x est plus grand que tous les éléments de l . Donc, vous pouvez utiliser carte pour construire le code que vous voulez, mais je pense que ce serait moche et pas le moyen le plus efficace pour le faire. Cependant, il fait ce que vous avez spécifiquement demandé (plusieurs comparaisons simultanées d'éléments de liste).

Questions connexes