在 Scheme 中编写除法函数
Writing a Division Function in Scheme
我正在尝试仅使用减法来创建除法函数。到目前为止,我所拥有的足以处理正数。一直欺骗我的是处理负数。我可以继续并获取 x 和 y 的绝对值并且它完美地工作,但是我的答案永远不会是否定的。这里有人曾经做过类似的事情吗?
(define Divide (lambda (a b c)
(if (> a 0)
(Divide (- a b) b (+ c 1))
c
)
)
)
在这种情况下,您通常希望定义一个辅助函数,供主函数在处理数据后调用:
(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))]))
您可以将 a 和 b 的符号值的乘积分配给一个变量,然后只处理两者的绝对值 a 和 b 同时进行递归。然后输出成为 c 和 sign 变量的乘积 (* 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
.
我正在尝试仅使用减法来创建除法函数。到目前为止,我所拥有的足以处理正数。一直欺骗我的是处理负数。我可以继续并获取 x 和 y 的绝对值并且它完美地工作,但是我的答案永远不会是否定的。这里有人曾经做过类似的事情吗?
(define Divide (lambda (a b c)
(if (> a 0)
(Divide (- a b) b (+ c 1))
c
)
)
)
在这种情况下,您通常希望定义一个辅助函数,供主函数在处理数据后调用:
(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))]))
您可以将 a 和 b 的符号值的乘积分配给一个变量,然后只处理两者的绝对值 a 和 b 同时进行递归。然后输出成为 c 和 sign 变量的乘积 (* 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
.