2016-11-08 109 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谢谢。这是*改造的诅咒* –