2017-04-12 77 views
0

我正在嘗試僅使用減法來創建除法函數。到目前爲止,我已經足夠處理積極的數字。不斷欺騙我的是處理負數。我可以繼續,只是抓住x和y的絕對值,它完美地工作,但我的答案永遠不會是消極的。這裏的任何人都必須以前做過類似的事情嗎?在方案中編寫除法函數

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

回答

1

您可以分配的一個標誌值的乘積b爲一個變量,然後在處理遞歸時僅處理ab的絕對值。然後輸出變爲c標記變量(* c sign)的乘積。考慮以下幾點:

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

例如,

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

請注意,如果您使用的條件(if (> a 0) ...而不是(if (>= a b) ...,那麼你在你的遞歸,這就是爲什麼使用函數添加一個額外的步驟, (Divide 10 7 0)輸出2

1

在這樣的情況下,你經常需要定義一個輔助功能,主要功能按摩後的數據稱:

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