我正在嘗試僅使用減法來創建除法函數。到目前爲止,我已經足夠處理積極的數字。不斷欺騙我的是處理負數。我可以繼續,只是抓住x和y的絕對值,它完美地工作,但我的答案永遠不會是消極的。這裏的任何人都必須以前做過類似的事情嗎?在方案中編寫除法函數
(define Divide (lambda (a b c)
(if (> a 0)
(Divide (- a b) b (+ c 1))
c
)
)
)
我正在嘗試僅使用減法來創建除法函數。到目前爲止,我已經足夠處理積極的數字。不斷欺騙我的是處理負數。我可以繼續,只是抓住x和y的絕對值,它完美地工作,但我的答案永遠不會是消極的。這裏的任何人都必須以前做過類似的事情嗎?在方案中編寫除法函數
(define Divide (lambda (a b c)
(if (> a 0)
(Divide (- a b) b (+ c 1))
c
)
)
)
您可以分配的一個和標誌值的乘積b爲一個變量,然後在處理遞歸時僅處理a和b的絕對值。然後輸出變爲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
。
在這樣的情況下,你經常需要定義一個輔助功能,主要功能按摩後的數據稱:
(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))]))