2017-04-12 3 views
0

J'essaie de créer une fonction de division en utilisant seulement la soustraction. Ce que j'ai jusqu'ici est suffisant pour gérer des nombres positifs. Ce qui continue de me tromper, c'est de le manipuler pour des nombres négatifs. Je peux aller de l'avant et saisir simplement la valeur absolue de x et y et cela fonctionne parfaitement, mais alors ma réponse ne peut jamais être négative. Quelqu'un ici qui devait faire quelque chose de similaire auparavant?Ecriture d'une fonction de division dans le schéma

(define Divide (lambda (a b c) 
        (if (> a 0) 
         (Divide (- a b) b (+ c 1)) 
         c 
         ) 
        ) 
) 

Répondre

1

Vous pouvez affecter le produit des valeurs de signe de un et b à une variable, puis traiter uniquement les valeurs absolues des deux un et b tout en effectuant la récursivité. La sortie devient alors le produit de c et le signe variable comme (* c sign). Considérez ce qui suit:

(define (divide num denom) 
    (let div ([n num] 
      [d denom] 
      [acc 0] 
      [sign 1]) 
    (cond 
     [(< n 0) 
     (div (- n) d acc (- sign))] 
     [(< d 0) 
     (div n (- d) acc (- sign))] 
     [(< n d) 
     (* sign acc)] 
     [else 
     (div (- n d) d (add1 acc) sign)]))) 

Par exemple,

> (divide 10 7) 
1 
> (divide -10 7) 
-1 
> (divide -10 -7) 
1 
> (divide 10 -7) 
-1 

Notez que si vous utilisez la condition (if (> a 0) ... au lieu de (if (>= a b) ..., vous ajoutez une étape supplémentaire dans votre récursion, ce qui explique pourquoi l'utilisation de votre fonction, (Divide 10 7 0) sorties 2.

1

Dans des cas comme cela, vous voulez souvent définir une fonction auxiliaire que la fonction principale appelle après le massage des données:

(define (Divide a b) 
    (define (go a b c) 
    (if (> a 0) 
     (go (- a b) b (+ c 1)) 
     c)) 
    (cond 
    [(and (> a 0) (> b 0)) 
    (go a b 0)] 
    [(and (< a 0) (< b 0)) 
    (go (- a) (- b) 0)] 
    [(< a 0) 
    (- (go (- a) b 0))] 
    [(< b 0) 
    (- (go a (- b) 0))]))