在Ruby中使用递归循环时附加数组

时间:2016-06-30 18:11:49

标签: arrays ruby recursion

我正在使用Ruby中的Collatz Conjecture并在n = 1处停止。 这是我到目前为止的代码:

我希望代码在整个循环中返回所有n个值的数组。 例如,如果我def collatz(n) arr = [] if n == 1 arr << n return arr elsif n % 2 == 0 n = n / 2 arr << n collatz(n) else n = (3 * n) + 1 arr << n collatz(n) end end ,我希望它显示collatz(10)

现在它显示[5,16,8,4,2,1]任何输入值。这是因为在第一个循环之后,它调用了collat​​z(n),第一行显示[1],从而在每个循环中重置我的数组。

如何在追加数组的同时继续方法循环?

2 个答案:

答案 0 :(得分:1)

您可以使用此代码。

如果n为1,则返回Array。 如果n%2 == 0则使用n / 2否则使用(3 * n)+ 1。 如果n现在为1,则返回Array,或者使用n值定义新的Array并使用新的n调用自己。

def collatz(n)
  return [n] if n == 1
  n = n % 2 == 0 ? n / 2 : (3 * n) + 1
  n == 1 ? [n] : [n] + send(__method__, n)
end

<强>输出

p collatz(10)
# => [5, 16, 8, 4, 2, 1]

我希望这会有所帮助

答案 1 :(得分:0)

将数组添加到params作为exampled:

def collatz(arr, n)
  if n == 1
    arr << n
    return arr
  elsif n % 2 == 0
    n = n / 2
    arr << n
    collatz(arr, n)
  else
    n = (3 * n) + 1
    arr << n
    collatz(arr, n)
  end
end

puts "#{collatz([], 10).join(', ')}"

结果将如您所愿:

[5, 16, 8, 4, 2, 1, 1]

但请记住:递归是邪恶的!

并且在recurse中:

def collatz(n)
  arr = []
  loop do
    n = n % 2 == 0 ? n / 2 : (3 * n) + 1
    arr << n
    break if n == 1
  end
  arr
end

puts "#{collatz(10).join(', ')}"
相关问题