2016-10-26 2 views
-1

Вот мой код до сих пор:Преобразование результата рекурсии в строку, чтобы напечатать его назад

import string 
def convert(num,base): 
    if num==0: 
     return 
    else: 
     remainder = num%base 
     num = num//base 
     b=(str(remainder)) 
     print(b[::-1],end="") 
     return convert(num,base) 

Вместо печати это:

>>> convert(29,3) 
2001 

мне нужно напечатать его назад, как это (и это должно быть сделано с помощью строк):

>>> convert(29,3) 
1002 

Похоже строка не очень хорошо работает с рекурсией:

>>> convert(29,3) 
('2', ('0', ('0', ('1', None)))) 
+0

Взгляните на это, может быть? http://codereview.stackexchange.com/questions/102052/reversing-a-string-in-python –

ответ

3

Просто изменить порядок, в котором вы печатаете и RECURSE:

import string 
def convert(num,base): 
    if num==0: 
     return 
    remainder = num % base 
    num = num // base 
    convert(num, base) 
    print(remainder, end="") 

>>> convert(29,3) 
1002 

Понятия не имею, что convertBase() есть.

+0

+1 Для вас, поскольку реальной проблемой был просто порядок, в котором оценивались рекурсивные фреймы. – sberry

0

Ваша рекурсивная функция верна в том смысле, что она имеет предложение exit (if num == 0:), однако из-за природы рекурсивных функций порядок выполнения будет обратным тому, что вы хотите распечатать. Что нужно сделать здесь, так это продолжать добавлять остатки в список, а затем, наконец, когда вы нажимаете предложение exit, отмените этот список и распечатайте его.

import string 
def convert(num, base, rem_list=None): 
    if not rem_list: 
     rem_list = [] 
    if num == 0: 
     rem_list.reverse() 
     print "".join(rem_list) 
    else: 
     remainder = num % base 
     num = num // base 
     rem_list.append(str(remainder)) 
     return convert(num, base, rem_list) 



>>> convert(29, 3) 
1002 
>>> convert(29, 3) 
1002 
+0

И если вы дважды назовете эту функцию, вы должны посмотреть на последствия изменения типов по умолчанию. – AChampion

+0

Если вы вызываете 'convert (29, 3); convert (29, 3) 'во второй раз, когда вы получите' 10022001'. – AChampion

+0

Почему это происходит, поскольку мы вызываем 'convert (num, base, rem_list = [])' с по умолчанию 'rem_list = []'? – RFVenter

1

Бросать в мои $ 0,02. Я бы предпочел вернуть всю строку, а не печатать ее, когда вы идете.

def convert(num, base): 
    if num == 0: 
     return '' 
    num, remainder = divmod(num, base) 
    return convert(num, base) + str(remainder) 

РЕДАКТИРОВАТЬ мог бы также использовать встроенный в divmod для вычисления Num и остатка.

+0

Согласитесь, это более идиоматическое рекурсивное решение. Но если мы пойдем так далеко, я, вероятно, просто сделаю этот итерационный цикл «while» :) – AChampion

+0

Да, вы говорите правду. – sberry

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