我正在使用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]
任何输入值。这是因为在第一个循环之后,它调用了collatz(n),第一行显示[1]
,从而在每个循环中重置我的数组。
如何在追加数组的同时继续方法循环?
答案 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(', ')}"