方案检查值,如果不均匀

时间:2014-09-17 01:01:19

标签: scheme logical-operators

我有以下功能来检查正值是否均匀。

(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)
    )

2 个答案:

答案 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