2015-03-14 3 views
0
def find_values(number, base, args=[]): 
    if number // base != 0: 
     args = args + find_values(number // base, base, args+[number % base]) 
     return args 
    else: 
     args = args + [number % base] 
     return args 

print(find_values(120, 10)) 

Функция должна принять номер (как основание 10) и изменить его для соответствия заданному базовому значению.Найти базовое значение заданного числа с помощью рекурсии в python

Это лучшее, что я придумал до сих пор. Массив, который возвращен и напечатан, имеет все три значения, которые мне нужно быть там, но по какой-то причине есть дополнительный 0 в индексе 0, и массив нуждается в реверсировании, однако каждый раз, когда я пытаюсь это сделать в инструкции else, я получаю сообщение об ошибке. Есть ли способ сделать это с помощью моего текущего кода?

Хотя я понимаю принципы, лежащие в основе рекурсии, я очень затрудняюсь применить его к этой проблеме и буду признателен за любую помощь.

ответ

1

Вы делаете две ошибки:

  • Вы Предварение существующего args списка перед новыми номерами; обрати их.

  • При рекурсии вы добавляете существующий список argsдважды. Один раз в качестве аргумента для рекурсивного вызова и снова возвращаемого значения. Выберите один или другой, а не оба.

В следующей версии исправлены обе ошибки, только манипулируя args в одном направлении:

def find_values(number, base, args=[]): 
    if number // base != 0: 
     args = find_values(number // base, base, [number % base] + args) 
     return args 
    else: 
     args = [number % base] + args 
     return args 

, который может быть упрощено до:

def find_values(number, base, args=[]): 
    args = [number % base] + args 
    if number // base: 
     return find_values(number // base, base, args) 
    return args 

Вместо построения списка в качестве аргумента, вы можете его построить как можно дальше:

def find_values(number, base): 
    args = [number % base] 
    if number // base: 
     return find_values(number // base, base) + args 
    return args 
+0

Спасибо, ваши решения чрезвычайно полезны! – Sev

1

Другой (проще) подход с использованием рекурсии будет:

def find_values(number, base): 
    if number < base: 
     return [number] 
    else: 
     return find_values(number/base, base) + [number % base] 
Смежные вопросы