【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