我正在学习ruby并使用codewars进行实践,我遇到了一个挑战,我觉得我基本上理解了这个挑战,但我无法想出如何继续循环使用这个方法,直到我达到我想要的结果。
挑战在于要求通过将数字相乘来减少一个数字,直到乘法得到一个位数。最后,它希望您返回您必须乘以数字的次数,直到得到一个位数。示例->给定->39;3 * 9 = 27, 2 * 7 = 14, 1 * 4 = 4; 回答->3
这是我的密码:
def persistence(n)
if n < 10
return 0
end
arr = n.to_s.split("")
sum = 1
count = 0
arr.each do |num|
sum *= num.to_i
if num == arr[-1]
count += 1
end
end
if sum < 10
return count
else
persistence(sum)
end
end
谢谢你的帮助!
2条答案
按热度按时间bf1o4zei1#
使用递归时,您的函数看起来很棒,但每次循环运行时,您都将count变量重置为0,我认为如果使用辅助方法,它应该运行正常:
这是您代码的基础,但有一些小的改进:
较短的解决方案可以是:
没有递归:
dffbzjpn2#
让我们看一次更好的方法:
细分:
你知道,这让我们
["1", "2", "3", "4"]
. 我们可以很容易地回到[1, 2, 3, 4]
通过Map#to_i
方法将其应用于该数组中的每个字符串。然后我们需要将它们相乘。
#reduce
这是一个方便的方法。我们可以通过一个街区:或者走捷径:
至于循环,您可以使用递归,并创建
product_of_digits
作为一种新的检测方法Integer
.我们现在可以简单地对任何整数调用此方法。