Math 在Scheme中编写除法函数
我试图创建一个只使用减法的除法函数。到目前为止,我所掌握的足以处理正数。让我一直困惑的是处理负数。我可以继续,只要抓住x和y的绝对值,它就能完美地工作,但我的答案永远不会是否定的。这里有谁曾经做过类似的事情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
(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)]
[(和(
您可以将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)])))
请注意,如果使用条件
(if(>a0)
,而不是(if(>=ab)
),则在递归中添加一个额外步骤,这就是为什么要使用函数(除以10 7 0)
输出2
您可以将a和b的符号值的乘积指定给一个变量,然后在执行递归时只处理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