Scheme尾递归(BitsOn计数)

时间:2015-10-29 00:25:08

标签: recursion scheme tail-recursion bits

我需要一些帮助来实现一个接收数字的函数,并返回为了表示二进制基数中的输入数而需要“打开”的位数。 例如,数字5以二进制表示为101,因此需要两个位“开启”。

实施例: (numOfBitsOn 5)将返回2,因为二进制中的5是101 (numOfBitsOn 101)将返回4,因为二进制101是1100101

  • 该函数必须写为尾递归。

这是第一次学习Scheme。到目前为止,这就是我写的所有内容:

(define (numOfBitsOn number)
  (define (numOfBitsOn-2 number acc)
    (cond ((eq? number 0)acc)
          (not(eq? (modulo number 2)0) (+ acc 1))
          (numOfBitsOn-2 (/ number 2) acc)))) 

它给了我:

begin (possibly implicit): no expression after a sequence of internal definitions in: (begin (define (numofbitson-2 number acc) (cond ((eq? number 0) acc) (not (eq? (modulo number 2) 0) (+ acc 1)) (numofbitson-2 (number) acc))))

我确定它甚至不接近解决方案= \

你能帮帮我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

(define (slow-popcount n)
  (do ((n n (quotient n 2))
       (count 0 (+ count (modulo n 2))))
      ((zero? n) count)))