没有全局变量的Ruby递归计数器

时间:2016-05-12 17:14:16

标签: ruby recursion

我正在尝试计算方法在程序生命周期内递归的次数。下面的代码获得了所需的结果,但使用了全局变量。有没有办法绕过这个或更好的方式?

$count = 0
def AdditivePersistence(num)
  return 0 if num.to_s.length == 1  
  numarr = num.to_s.chars.map!(&:to_i)
  i = numarr.inject(&:+)
  $count+=1
    if i.to_s.length!=1
    AdditivePersistence(i)
    end
  $count
end

3 个答案:

答案 0 :(得分:1)

由于您希望在程序的生命周期内递归调用的总数,因此以某种形式的全局变量是您可以执行此操作的唯一方法。您可以像使用的那样使用显式全局变量,也可以使用伪装全局变量,例如单例类或线程局部变量。我不会在这里说明这些,因为它们不如这个用例的普通全局变量。

答案 1 :(得分:0)

您可以接受一个数组,其中数组中的第一个变量为num,然后第二个变量为count。然后你就会做return [num, count]

答案 2 :(得分:0)

另一种选择是更新您的方法定义以接受计数器作为参数。

使用这种方法,您的方法可以递增它接收的任何计数器值,然后在递归调用中传递递增的值。

def AdditivePersistence(num, counter)
  return 0 if num.to_s.length == 1  
  numarr = num.to_s.chars.map!(&:to_i)
  i = numarr.inject(&:+)
  counter +=1
    if i.to_s.length!=1
    AdditivePersistence(i, counter)
    end
  counter
end
# usage
AdditivePersistence(12, 0)