2015-10-29 4 views
1

Функция получает номер и возвращает количество бит, которое должно было быть , которое должно быть «включено», чтобы представлять входной номер в двоичной базе. Например, число 5 представлено как 101 в двоичном формате и поэтому требует, чтобы два бита были «включены». Мне нужно знать, является ли функция, которую я написал, хвостовой рекурсией. Если нет, как я могу превратить его в рекурсию хвоста? Благодаря!Является ли эта функция схемы рекурсивной?

Моя функция:

(define (numOfBitsOn number) 
    (define (numOfBitsOn-2 number acc) 
     (if (> number 0) 
      (if (odd? number) 
       (numOfBitsOn-2(/(- number 1) 2) (+ acc (modulo number 2))) 
       (numOfBitsOn-2 (/ number 2) acc)) 
      acc)) 
    (numOfBitsOn-2 number 0)) 
+1

Да, это хвост рекурсивный. – uselpa

ответ

3

DrRacket может помочь вам определить, является ли вызов в хвостовой позиции или нет. Нажмите кнопку «Проверка синтаксиса». Затем переместите указатель мыши в левую скобку соответствующего выражения. В качестве примера я получаю это:

TCO example

Фиолетовая стрелка показывает, что выражение находится в хвостовой позиции.

Из инструкции:

хвостовой рекурсии: Любой суб-выражение, которое (синтаксический) в хвостовом положении относительно его ограждающего контекста аннотированного по рисунку света лилового стрелка из выражения хвоста к его окружающему выражению.

+0

Танки много! – Ohad121

Смежные вопросы