2017-04-12 6 views
0

Ich versuche, eine Division-Funktion nur mit Subtraktion erstellen. Was ich bisher habe, reicht aus, um mit positiven Zahlen umzugehen. Was mich immer wieder aufmischt, ist, es für negative Zahlen zu handhaben. Ich kann weitermachen und einfach den absoluten Wert von x und y nehmen und es funktioniert perfekt, aber dann kann meine Antwort niemals negativ sein. Wer hat hier schon mal was Ähnliches machen müssen?Schreiben einer Division-Funktion in Schema

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

Antwort

1

Sie das Produkt von Vorzeichenwerte von einem zuweisen und b zu einer Variablen, dann nur mit absoluten Werten von sowohl a als auch b während der Rekursion beschäftigen. Die Ausgabe wird dann zu dem Produkt c und dem Zeichen variabel als (* c sign). Beachten Sie Folgendes:

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

Zum Beispiel

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

Beachten Sie, wenn Sie die Bedingung (if (> a 0) ... statt (if (>= a b) ... verwenden, dann Sie einen zusätzlichen Schritt in der Rekursion hinzuzufügen, weshalb Ihre Funktion, (Divide 10 7 0) Ausgänge 2.

1

In Fällen wie diesem wollen Sie oft eine Hilfsfunktion, die die Hauptfunktion ruft nach Massieren der Daten definieren: kann

(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))])) 
Verwandte Themen