在Scheme中编写一个Division函数

时间:2017-04-12 02:13:26

标签: math scheme racket r5rs

我正在尝试仅使用减法创建一个Division函数。到目前为止,我已经足够处理正数了。不断欺骗我的是处理负数。我可以继续前进,只需抓住x和y的绝对值就可以完美地运行,但是我的回答永远不会是负面的。这里有人不得不做类似的事吗?

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

2 个答案:

答案 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}的原因}。