如何循环整个方法,直到实现所需的目标(ruby)

monwx1rj  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(311)

我正在学习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

谢谢你的帮助!

bf1o4zei

bf1o4zei1#

使用递归时,您的函数看起来很棒,但每次循环运行时,您都将count变量重置为0,我认为如果使用辅助方法,它应该运行正常:
这是您代码的基础,但有一些小的改进:

def persistence(n)
  return 0 if n < 10
  count = 0

  multiply_values(n, count)
end

def multiply_values(n, count)
  arr = n.to_s.chars
  sum = 1
  arr.each do |num| 
    sum *= num.to_i 
    if num == arr[-1]
      count += 1
    end
  end

  if sum < 10
    return count 
  else
    multiply_values(sum, count)  
  end
end

较短的解决方案可以是:

def persistence(n)
  return 0 if n < 10
  multiply_values(n, 1)
end

def multiply_values(n, count)
  sum = n.to_s.chars.map(&:to_i).reduce(&:*)
  return count if sum < 10

  multiply_values(sum, count + 1)  
end

没有递归:

def persistence(n)
  return 0 if n < 10

  count = 0
  while n > 10
    n = n.to_s.chars.map(&:to_i).reduce(&:*)
    count += 1
  end
  count
end
dffbzjpn

dffbzjpn2#

让我们看一次更好的方法:

num = 1234
product = num.to_s.split("").map(&:to_i).reduce(&:*)

细分:

num.to_s.split("")

你知道,这让我们 ["1", "2", "3", "4"] . 我们可以很容易地回到 [1, 2, 3, 4] 通过Map #to_i 方法将其应用于该数组中的每个字符串。

num.to_s.split("").map(&:to_i)

然后我们需要将它们相乘。 #reduce 这是一个方便的方法。我们可以通过一个街区:

num.to_s.split("").map(&:to_i).reduce { |a, b| a * b }

或者走捷径:

num.to_s.split("").map(&:to_i).reduce(&:*)

至于循环,您可以使用递归,并创建 product_of_digits 作为一种新的检测方法 Integer .

class Integer
   def product_of_digits
      if self < 10
         self
      else
         self.to_s.split("").map(&:to_i).reduce(&:*).product_of_digits
      end
   end
end

我们现在可以简单地对任何整数调用此方法。

1344.product_of_digits # => 6

相关问题