我正在尝试仅使用减法创建一个Division函数。到目前为止,我已经足够处理正数了。不断欺骗我的是处理负数。我可以继续前进,只需抓住x和y的绝对值就可以完美地运行,但是我的回答永远不会是负面的。这里有人不得不做类似的事吗?
(define Divide (lambda (a b c)
(if (> a 0)
(Divide (- a b) b (+ c 1))
c
)
)
)
答案 0 :(得分: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))]))
答案 1 :(得分:1)
您可以将符号值 a 和 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)
输出{{1}的原因}。