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

您可以将 ab 的符号值的乘积分配给一个变量,然后只处理两者的绝对值 ab 同时进行递归。然后输出成为 csign 变量的乘积 (* 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.