2015-10-29 39 views
0

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

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

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

这是第一次学习计划。截至目前,这是所有我写道:

(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

提示:你定义了'numOfBitsOn-2',但你从来没有真正从它自己的定义之外调用它。此外,正如一个侧面说明,Scheme命名约定指定名称的元素应该用连字符分隔,而不是驼峰大小,因此您的函数应该称为“num-of-bits-on”。 –

+0

你的意思是“你从来没有从自己的定义之外实际调用它”?我应该在哪里调用它(我教最后一行假设这么做)? – user5500724

+1

是的,你需要从'numOfBitsOn'里面调用'numOfBitsOn-2',但在'numOfBitsOn-2'外面调用'递减'递归。考虑一个函数'(define(f)(f))'。不是一个非常有用的功能,因为它所做的只是永远调用自己。然而,简单地*定义*该函数根本不会做任何事情!你必须首先调用'(f)'来陷入无限循环。 –

回答

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