【python解题笔记20210316】CodeWars:Persistent Bugger

题目

内容:编写一个函数,入参为大于0的正整数,将该数的每位数相乘后得出1个新的正整数,再次将新的正整数每位数相乘,依次循环至结果为10以下的数,计算结束后,该函数出参为上述计算的次数

链接:https://www.codewars.com/kata/55bf01e5a717a0d57e0000ec/train/python

截图:

解题

思路:

1、分析每次计算一轮后得出的新整数要进入下一轮计算,因此引入递归函数;

2、使用str函数将入参正整数转换成字符串,再使用list函数将每位数转成每个单独的数字,再使用int将列表中的字符串数字,转成列表中的数字,以此得出每次计算所需的每位数字;

3、将每轮需计算的各位数字相乘得出一轮计算的结果;

4、一轮计算后,返回计算的次数1,并且将一轮计算的结果作为入参,再次递归调用计算函数,直到计算结果为个位数为止;

5、多轮计算后得出递归计算的总次数;

结果:

  

源码:

def persistence(n):
    """
    递归函数,用于求解Persistent Bugge,例如
    persistence(39) => 3  # Because 3*9 = 27, 2*7 = 14, 1*4=4
                       # and 4 has only one digit.
    persistence(999) => 4 # Because 9*9*9 = 729, 7*2*9 = 126,
                       # 1*2*6 = 12, and finally 1*2 = 2.
    persistence(4) => 0   # Because 4 is already a one-digit number.
    :param n: 入参,正整数
    :return: 一轮计算后的正整数以及迭代的次数
    """
    if n<=9:       #递归终止条件,如果是个位数则终止
        return 0
    else:
        numbers = [int(i) for i in list(str(n))]    #先使用str函数将入参转换成字符串,再使用list函数将每位数转成每个单独的数字,再使用int将列表中的字符串数字,转成列表中的数字
        print(numbers)
        result = 1
        for i in numbers:     #循环计算列表中的每位数字相乘的结果
            result = result * i
            pass
        return 1+persistence(result)   #递归调用此函数,将一轮计算的结果作为入参

知识点

1、递归函数的使用,重点是递归结束条件,递归执行的次数在每次递归return结果加1。

2、str()函数的使用,将任意输入转换成字符串。

3、list()函数的使用,将字符串转成内容为字符串的列表。

4、int()函数的使用,将字符串转换成数字。 

参考资料:

https://www.php.cn/python-tutorials-423731.html

https://www.cnblogs.com/sea-stream/p/9484024.html

https://blog.csdn.net/ruanxingzi123/article/details/82658669

原文地址:https://www.cnblogs.com/chooperman/p/14543497.html