我有以下功能来检查正值是否均匀。
(define (even? n)
(cond
((= n 0) #t)
((< n 0) #f)
(else (even? (- n 2)))
)
)
我正在尝试使用此函数在使用even?
函数和逻辑not
检查值不均匀(奇数)时递增商店计数器,但我似乎无法弄清楚正确的语法。
(define (function a b)
(define (iter a b store)
(cond
((= b 1) (+ store a)
(else
(iter (double a) (halve b) (if (not (even? b)) (+ a store) store)))
)
)
(iter a b 0)
)
任何人都可以检查我的语法,看看我做错了吗?
(function 1 1)
的来电应返回1
(fucntion 1960 56)
的来电应返回109760,但我收到141120
编辑:
我意识到我的halve
功能必须是不正确的。我试图实现只使用减法的减半函数。
(define (halve n)
(define (iter src store)
(cond
((<= src 0) store)
(else (iter (- src 2) (+ store 1)))
)
)
(iter n 0)
)
答案 0 :(得分:1)
在调用)
之前,您似乎错过了iter
。
答案 1 :(得分:1)
请注意,even?
功能是内置的,您无需实现它。现在关于这个问题 - 这条线没有按照你的想法行事:
(if (not (even? b)) (+ a store))
该表达式不会更新store
的值,它只是评估将a
添加到store
的结果,然后获取的值丢失 - 我们没有保存它,我们没有将它传递给递归,添加的结果被丢弃,然后执行下一行。
在Scheme中,我们使用set!
来更新变量,但这是不赞成的,我们试图避免变异操作 - 在这种情况下它没有必要,我们只需要将正确的值传递给递归调用
<强>更新强>
现在您已经明确表示正在实施Ethiopian multiplication算法,这就是应该如何完成的:
(define (halve n)
(quotient n 2))
(define (double n)
(* 2 n))
(define (function a b)
(define (iter a b store)
(cond
((= a 0) store)
((even? a) (iter (halve a) (double b) store))
(else (iter (halve a) (double b) (+ store b)))))
(iter a b 0))
按预期工作:
(function 1 1)
=> 1
(function 1960 56)
=> 109760