2015-11-14 3 views
1

Я пытаюсь вернуть количество цифр в числе, используя рекурсию следующим образом: DigitCount (3456) → 4. Код, который у меня есть без использования рекурсии, отлично работает, что:Возвращение числа цифр числа с помощью рекурсии

def DigitCount(n) 
     return len(str(n)) 

Но когда я пытаюсь использовать рекурсию таким образом:

def DigitCount(n): 
     return len(str(DigitCount(n))) 

Я получаю сообщение об ошибке: «RecursionError: максимальная глубина рекурсии превышена»

+1

это бесконечный цикл! – juankirr

ответ

2

Проблема с вашей рекурсивной функцией заключается в том, что вы не указали базовый регистр для завершения рекурсии, создавая бесконечный цикл, который заканчивается переполнением стека.

При написании рекурсивных процедур, вы должны думать, как сделать проблему меньше при каждом вызове (в данном случае, деление на 10 делает трюк), пока не достигнет точки, где эта проблема настолько проста, что вы уже знаю ответ - например, число меньше 10 имеет одну цифру. Попробуйте это:

def DigitCount(n): 
    if n < 10: 
     return 1 
    else: 
     return 1 + DigitCount(n/10) # use n // 10 in Python 3.x 

Он работает, как и ожидалось, до тех пор, как n больше или равна нулю:

DigitCount(0) 
=> 1 
DigitCount(234) 
=> 3 
+1

Большое вам спасибо, работает блестяще !! – DecafOyster208

1

А что-то вроде:

def DigitCount(n): 
    if n<10: return 1 
    return 1 + DigitCount(n//10) 

Идея такова:

  • число меньше 10 имеет длину 1
  • число больше 10 имеет длину 1 + длина (п // 10); например, 456 имеет длину 1 + длину (45).
1

Это может быть сделано с помощью строки также.

def digitCount(n): 
    if len(str(n)) == 1: 
     return 1 
    else: 
     return 1 + digitCount(str(n)[1:]) 

Это немного грязно и очень неэффективно, но работает.

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