Math 在Scheme中编写除法函数

Math 在Scheme中编写除法函数,math,scheme,racket,r5rs,Math,Scheme,Racket,R5rs,我试图创建一个只使用减法的除法函数。到目前为止,我所掌握的足以处理正数。让我一直困惑的是处理负数。我可以继续,只要抓住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
                        )
                    )
  )

在这种情况下,通常需要定义一个辅助函数,主函数在处理数据后调用该函数:

(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)
(如果(>a 0)
(围棋(-a b)b(+c 1))
c) )
(续)
[(和(>A0)(>B0))
(通过a b 0)]
[(和(
在这种情况下,您通常需要定义一个辅助函数,主函数在处理数据后调用该函数:

(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)
(如果(>a 0)
(围棋(-a b)b(+c 1))
c) )
(续)
[(和(>A0)(>B0))
(通过a b 0)]
[(和(
您可以将ab的符号值的乘积指定给变量,然后在执行递归时仅处理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)])))

请注意,如果使用条件
(if(>a0)
,而不是
(if(>=ab)
),则在递归中添加一个额外步骤,这就是为什么要使用函数
(除以10 7 0)
输出
2

您可以将ab的符号值的乘积指定给一个变量,然后在执行递归时只处理a和b的绝对值。然后输出成为c的乘积,符号变量为
(*c符号) >考虑以下内容:

(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)])))
请注意,如果使用条件
(if(>a0)
而不是
(if(>=ab)
),则在递归中添加一个额外步骤,这就是为什么使用函数
(除以10 7 0)
输出
2