2012-06-01 2 views
0
def dec2binr(n): 
    if n == 1: 
     return '1' 
    else: return (str(n%2)+dec2binr(n//2))[::-1] 

Без [:: - 1] он возвращает обратное двоичное число. [:: - 1] не работает в этом случае - при п = 40 Ii прибудете:Ошибка простого рекурсивного двоичного преобразователя

011000 

, когда я бы ожидать

101000 

Без [:: - 1] я получаю

000101 

Какая обратная, но правильная. Почему это происходит и как я могу это исправить?

+3

Вам также нужен базовый футляр для '0'. – jpm

+0

@jpm: no, '0% 2 == 0' –

+0

@MartijnPieters Это правда, но когда' 0' передается, мы возвращаем 'str (n% 2)', конкатенированный с результатом вызова рекурсивной функции (снова , с аргументом '0') – jpm

ответ

3

Вам нужно обратить вспять, как вы добавляете строки.

return dec2binr(n//2) + str(n%2) 

Проблема в том, n%2 прочтет значащий бит, но вы добавляя его в левой части строки, которая является наиболее значимым местом.

+0

Да, это имеет смысл. Спасибо. – 1nterference

2

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

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