Решение M цифр рекурсивно слева - PullRequest
1 голос
/ 29 февраля 2020

Привет, ребята, мне удалось решить рекурсивно из R -> L:

nth_di git (1, 12345) => 5 nth_di git (3, 12345) => 3 nth_di git (4, 12345) => 2 nth_di git (10, 12345) => Нет

и интересовался, существует ли способ рекурсивного решения этой проблемы из L -> R такой, что:

nth_di git (1, 12345) => 1 nth_di git (3, 12345) => 3 nth_di git (4, 12345) => 4

Я создал базовый вариант, но не уверен, как мне решить рекурсивную часть.

def mth_digit(m, num):
s = str(num)
if m == 0 or m > len(s):
    return None
elif m == 1:
    return num // 10**(len(s)-m)
else:
    #need help here

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Вам нужно будет использовать степени 10 и уменьшать размер числа, пока оно не будет иметь количество цифр, соответствующее нужной вам позиции. Тогда результатом будет последний ди git из оставшегося числа. Если число не достаточно велико для n-го числа git слева, возвращается None.

Например:

def nthDigit(d,N):
    if N >= 10**d     : return nthDigit(d,N//10)
    if N >= 10**(d-1) : return N%10

output:

for i in range(1,7):
   print( i,nthDigit(i,1234) )

1 1
2 2
3 3
4 4
5 None
6 None

Вы также можете сделать это, используя только умножения и деления:

def nthDigit(d,N,p=1):
    if d>0      : return nthDigit(d-1, N, p*10)
    if N>=p     : return nthDigit(d, N//10, p)
    if N>=p//10 : return N%10 

Конечно, вы также можете обмануть и использовать строку, но это вообще не потребует рекурсии:

def nthDigit(d,N): return str(N)[d-1:d]
0 голосов
/ 29 февраля 2020

Решение:

def mth_digit(m, num):
s = str(num)
if m == 0 or m > len(s):
    return None
if m == 1:
    return num // 10**(len(s)-1)
else:
    return mth_digit(m-1, num % (10**(len(s)-1)))
...