2016-11-08 106 views
0

也許你們中的一些人已經嘗試解決codewars上的「持續性bugger」任務。 因此,這裏是輪到我了:)python:遞歸函數計數器。持久性問題

def persistence(num): 
    multi = 1 
    while num: 
    multi *= num % 10 
    num /= 10 
    global count 
    count += 1 
    if(multi >= 10): 
    persistence(multi) 
    else: 
    return 0 
    return count 
count = 0 
print(persistence(39)) 
#print(persistence(25)) 

它給了我正確的迭代結果和1次嘗試的成功的結果。 (persistence(39) => 3 # Because 3*9 = 27, 2*7 = 14, 1*4=4)但由於使用全局變量,我無法運行它超過1次。如何處理這個?我怎樣才能創建計數器,並在這個時候遞歸地使用這個函數?

+1

我不知道你在做什麼功能是幹什麼的,但我猜你會想'返回的持久性(多)'而不是僅僅調用它。此外,如果您需要維護計數,則可以將其作爲第二個參數傳遞,而不是調用全局。 'def persistence(num,count):' – Hoopdady

+0

既然我不熟悉那個「任務」,你能告訴我們你想完成什麼嗎? – wheaties

+0

這是一個問題:編寫一個函數,持久性,它接受一個正參數num並返回它的乘法持久性,這是你必須在num中乘以數字的次數,直到達到一個數字。 「持久性(39)=> 3」,「持久性(25)=> 2」。所以我應該返回'count'。在我的情況下,我使用全局變量。這就是爲什麼計數器總是增加,我得到第二次運行5(3 + 2)而不是2。 – ascentman

回答

1

在遞歸,如果你需要管理狀態,你的函數的參數範圍內對其進行管理:

def persistence(num): 
    #here is your code, slightly modified. 
    def _persist(num,count=0): 
    multi = 1 
    while num: 
     multi *= num % 10 
     num /= 10 
    if(multi >= 10): 
     return _persist(multi,count+1) 
    else: 
     return count 
    return _persist(num) 

在那裏你有效呈現一個界面爲你的功能,但你實際上調用它遞歸通過_perist

+0

這個外部函數是否返回? – ascentman

+0

@ascentman是的,你將嵌入與他在他的問題中所寫的相同的代碼。所以'_persist'會返回'count'。 – wheaties

+0

我不能得到,但結果我得到:「1」和「1」。我也刪除了'count'的全局定義。調用inner函數後,每次都使用count(zero)的默認值。 – ascentman

2

你的嘗試很好,但方法很幼稚,並有其小缺陷。使用global來保持功能的遞歸調用的計數存在使用相同的計數變量用於隨後的新的不相關的調用的問題;這就是爲什麼你現在有這個問題。

您可以通過將返回值遞增1並在上次調用中返回0來計數您的函數執行遞歸的次數。最後的計數是所有遞歸調用後的累計計數。

這裏是做與operator.mulfunctools.reduce一個辦法:

from functools import reduce 
import operator 

def persistence(num): 
    if len(str(num)) == 1: 
     return 0 
    val = reduce(operator.mul, map(int, str(num))) 
    return 1 + persistence(val) 

print(persistence(39)) 
# 3 
print(persistence(25)) 
# 2 
+0

的定義就像你根本不需要計數... – Copperfield

+0

@Copperfield謝謝。這是*改造的詛咒* –