python:递归函数计数器。持久性问题

时间:2016-11-08 15:28:50

标签: python recursion

也许你们中的一些人已经试图解决这个问题"持久的bugger"代码战的任务。 所以轮到我了:)

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次。怎么处理这个?如何创建计数器并在此时递归使用此函数?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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递归地调用它。

答案 2 :(得分:0)

您可以通过while循环轻松地做到这一点!

def persistence(n):
    loop_count = 0
    while len(str(n)) != 1:
        i = 1
        for number in str(n):
            i = int(number) * i
        n = i
        loop_count += 1
    return loop_count