2017-02-04 2 views
1

я сталкиваюсь со странной проблемой:Создание функции цифрового корня

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

digital_root(493193) 
=> 4 + 9 + 3 + 1 + 9 + 3 
=> 29 ... 
=> 2 + 9 
=> 11 ... 
=> 1 + 1 
=> 2 

и мой ответ:

def digital_root(n): 
    k = 10 
    while k > 9: 
     k = reduce(lambda x,y: int(x)+int(y), list(str(n))) 
    return k 

I положим к до 10, так что он будет напрямую входить в цикл. Но судья онлайн говорит, что это стоит слишком много времени.

и Стараюсь другое решение:

def digital_root(n): 
    while n > 9: 
     n = reduce(lambda x,y: int(x)+int(y), list(str(n))) 
    return n 

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

Кстати, я использую онлайн-судьи.

ответ

4

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

def digital_root(n): 
    k = 10 
    while k > 9: 
     k = reduce(lambda x,y: int(x)+int(y), list(str(n))) 
    return k 

reduce первый дает 29. так k > 9, и это делает его еще раз, но так как вы не переустанавливаете k, но повторно используете n, вы снова получите 29.

второе решение является правильным, поскольку он изменяет & пересылает n до тех пор, как он больше 9 (и не входит в петлю, если n <= 9, потому что в этом случае цифровой корень является само число).

Редактировать: для этого конкретного случая вам не нужен reduce. Этот код понятнее и, вероятно, быстрее:

def digital_root(n): 
    while n > 9: 
     n = sum(int(x) for x in str(n)) 
    return n 

(суммы всех ИНТ-конвертированы цифры n в генераторном понимании)

+0

Возможно, все еще может быть быстрее. http://stackoverflow.com/questions/14939953/sum-the-digits-of-a-number-python –

+0

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

+0

Спасибо всем, на самом деле это быстрее ' защиту digital_root (п): возвращение п% 9 или п и 9 ' Я видел этот код на codewars, очень умный! – SoulerTsai

0

Вы можете сделать, кроме того, что-то вроде этого примера:

def reduce_root(num = 0): 
    if isinstance(num, int): 
     return [k for k in str(num)] 
    else: 
     raise Exception("input number must be an integer!") 

def digital_root(num = 0): 
    number = reduce_root(num) 
    print("Number: {}".format(num)) 
    while True: 
     if len(number) == 1: 
      break 
     else: 
      print("=> {}".format(" + ".join(k for k in number))) 
      s = sum(int(k) for k in number) 
      print("=> {}".format(s)) 
      number = reduce_root(s) 

Выход:

digital_root(100245) 

Number: 100245 
=> 1 + 0 + 0 + 2 + 4 + 5 
=> 12 
=> 1 + 2 
=> 3 
+1

Я думаю, что выход был примером, на самом деле не нужен :) –

+0

Возможно, вы правы. Думаю, я должен подождать ответа OP. Тогда я могу отредактировать свой ответ. Спасибо, кстати, за ваш комментарий. –

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