2012-05-10 4 views
0

Мне нужно написать рекурсивную функцию, dec2base(n, b), которая возвращает список базовых чисел b цифр в натуральном выражении n. Например.Почему моя рекурсивная функция заблуждается?

dec2base(120, 10) => [1,2,0] (1 * 10**2 + 2 * 10**1 + 0 * 10**0) 

В настоящее время у меня есть.

def dec2base(n, b): 
    if n < 10: 
     return [n] 
    else: 
     return dec2base(n, b) + [n%b] 

Но когда я запускаю программу, она возвращает бесконечную ошибку цикла. Есть идеи?

+0

Добавьте некоторые операторы печати и смотреть его запустить. Это поможет вам понять, где вы ошибаетесь. – sdolan

ответ

0

Ваше призвание dec2base(n, b) до бесконечности. Если вы звоните:

dec2base(20, b) 

Ваша функция продолжит выполнение второй ветви вашего оператора if/else. Вам нужно передать уменьшенное значение вашему рекурсивному вызову функции, чтобы в итоге n < 10 оценил значение True.

+0

Я пробовал n-1, но это дает неправильный ответ. Должен ли я заниматься математическим стилем на n? – Hoops

+0

Do 'n // b'. Кроме того, ваш оператор if не имеет никакого смысла. 'dec2base (10,2)' даст [5, 0], что неверно. То, что вы хотите, это 'if n

+0

Отличное спасибо! – Hoops

3

Вы не уменьшаете значение n в любой точке вашего метода, поэтому, если вы начинаете с любого значения n> = 10, цикл никогда не заканчивается.

Другое наблюдение - логика «если n < 10 return [n]» кажется не имеющим смысла, если b не равно 10. Например, 9 < 10, но я принимаю значение dec2base (9,2) не будет [9]. Это будет [1,0,0,1].

2

Хорошо, в любой рекурсивной функции должна быть некоторая функция, которая стремится к нулю, чтобы что-то остановить. В этом случае, что вы хотите, чтобы действительно смоделировать путь you7 сделать это вручную:

  • разделить на радиксе (базовое)
  • положить остаток в качестве digite
  • повторялся с использованием того же но другая часть дивизии. (Фактор.)

То есть, если вы обнаружили шестнадцатиричное значение 1000, вы берете

dec2base (1000,16):

  • , если первый параметр == 0, возвращение, вы сделали
  • 1000 мод 16 (= 8) -> сохранить 8
  • dec2base (62, 16) -> рекурсии шаг

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

Вот реальный простой вариант в Python:

result = "" 

def dec2base(n,b): 
    global result 
    if n <= 0: return 
    result = str(n % b) + result # why am I prepending it? 
    dec2base(n // b, b) 

if __name__ == '__main__': 
    dec2base(1000,8) 
    print result 

Теперь, если база ничего> 9 (скажем, 16), вы должны позаботиться о переводе значений от 10 до 15 в альфа-аф, и это целенаправленно не очень элегантно, потому что я хотел, чтобы он выкладывался точно так же, как на примере.

+2

Рекурсивная функция, которая передает свой результат, изменяя глобальную переменную? *Шутки в сторону*? – Ben

+1

Я не уверен, как вы думаете, что это выложено, как пример? Откуда возникла необходимость в глобальной переменной? –

+0

Да, потому что это дает мне возможность задать вопрос о добавлении. Вам это не нравится, напишите свой собственный ответ. –

1

В вашем решении есть только несколько мелких ошибок.

def dec2base(n, b): 
    if n < b:       # so it will work for bases other than 10 
     return [n] 
    else: 
     return dec2base(n//b, b) + [n%b] # you're just missing "//b" here 

Вы можете упростить его немного как этот

def dec2base(n, b): 
    if not n: 
     return [] 
    return dec2base(n//b, b) + [n%b] 
Смежные вопросы