2017-02-04 59 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 

我令k到10,這樣它會直接進入循環。 但網上法官說它花費了太多時間。

,我嘗試另一種解決方案:

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

那麼問題就迎刃而解了。我可以弄清楚這兩個代碼有什麼區別

順便說一句,我使用codewars在線評判。這裏

回答

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所有INT-轉換位)

+0

雖然可能仍然可能會更快。 http://stackoverflow.com/questions/14939953/sum-the-digits-of-a-number-python –

+0

是的,轉換爲字符串可能不是所有來回轉換最好的事情,我可以有想到這一點...... –

+0

謝謝大家,其實這是更快 ' 高清digital_root(N): 回報N%或9 n和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的答案。然後我可以編輯我的答案。感謝您的評論。 –