首页 > 解决方案 > 返回递归函数 - Python

问题描述

目前我正在解决 CodeWars 上的问题,并且我被困在Persistent Bugger问题上。

编写一个函数,persistence,它接受一个正参数 num 并返回它的乘法持久性,这是您必须将 num 中的数字相乘直到达到单个数字的次数。

例如:

persistence(39) # 返回 3,因为 3 9=27, 2 7=14, 1 4=4 # 而 4 只有一位数字 persistence(999) # 返回 4,因为 9 9 9=729, 7 2 9=126 , # 1 2 6=12, 最后是 1 2=2

persistence(4) # 返回 0,因为 4 已经是一位数

我已经将我的问题缩小到一个递归函数,但是我在思考如何返回我的迭代计数器时遇到了麻烦。

目前它通过程序运行并保持准确的计数。但是,当它以单个数字值结束时,它会返回到持久性调用,每次都降低我的迭代。

def persistence(n, iter=0):
    chars = str(n)

    if n > 9:
        result = 1
        for y in chars:
            result = result * int(y)
        iter += 1
        persistence(result, iter)

    else:
        return iter

标签: pythonpython-3.xrecursionnumbers

解决方案


我已经阅读了您的问题,发现您面临的问题很有趣,您的代码大部分是正确的,即if没有递归调用的部分。

我已经调整了您的代码,以便它只需要一个参数使用 while 循环,并使用math.prod()方法,这样您就不必使用循环来获取列表的产品。

while循环基本上是if,除了它在执行后再次检查执行结果的条件,如果结果条件仍然为真,则循环执行,直到条件为假。

要使while循环递归,您只需将结果分配给输入:

chars = str(result)

所以这里是代码:

import math
def persistence(n):
    if n < 10: return 0
    else:
        chars = str(n)
        i = 0
        result = math.prod([int(y) for y in chars])
        while result > 10:
            i += 1
            result = math.prod([int(y) for y in chars])
            chars = str(result)
        return i

推荐阅读