我需要找到一种方法在完成一个测试样本后重置 "count" 而没有在递归函数期间重置计数

I need to find a way to reset "count" after completing one test sample with out reseting count during the recursive function

这是我的代码需要做的:

写一个函数,persistence,它接受一个正参数num和returns它的乘法持久性,也就是你必须将[=中的数字相乘的次数14=] 直到你达到一位数。

Test.it("Basic tests")
Test.assert_equals(persistence(39), 3)
Test.assert_equals(persistence(4), 0)
Test.assert_equals(persistence(25), 2)
Test.assert_equals(persistence(999), 4)

这是一个 Codewars 挑战。我可以单独测试断言样本,但不能同时测试所有样本。 Codewars 需要能够同时 运行 所有测试样本。我需要找到一种方法在完成一个测试样本后重置 count,而不是在递归函数期间重置 count

count = 0
def persistence(n):
    # your code
    global count

    #def recursion(result):
    number_str = str(n)

    ints = [int(i) for i in number_str if i != '0']
    result = 1
    for j in ints:
        result = result * j
    if result >= 10:
        print(ints,"\n\n------------------------------------------")
        count += 1
        print(count)
        print(result)

        return persistence(result)
    else:
        if count > 0:
            count += 1
            return count 
        else:
            return count

这是我想出的代码。我需要我的函数一次 运行 所有四个测试。我的函数可以递归地一次呈现一个测试,但不能一次呈现所有测试。我需要弄清楚如何在每次测试样本断言后重置 count

您可以只传递递归调用的倒计时,如下所示:

count = 0
def persistence(n, count):

    # ..
    # update count
    # ..

    return persistence(result, count)

    # ...
    return count

或者如果你不能改变persistance的签名,使用辅助函数,这在函数式编程中很常见。

def persistance(n):
    return persistance_aux(n, 0)

def persistance_aux(n, count):
    # ....

你的递归函数应该不需要全局变量。您可以将 counts 作为参数传递,使用默认值来处理未传入的 public API 情况:

def persistence(n, count=0):
    ...
    # everything is the same up until the recursion
    return persistence(result, count)

如果您愿意,您可以通过仅进行内联加法而不是在 count 上使用 += 语句来稍微简化代码,但这不会改变代码的行为。

我还要指出,由于您的函数是尾递归的,因此您可以很容易地将递归替换为循环。我认为这样的事情可能会做到:

def persistance(n):
    count = 0
    while n >= 10:
        count += 1
        ints = [int(i) for i in str(n) if i != '0']
        n = 1
        for i in ints:
            n *= i
    return count