我正试图找到这个胶合序列的长度。如果我将test_array << number
更改为puts number
,我可以输出序列中的每个数字但由于某种原因,我无法在返回新值之前将此函数推送到数组中进入功能。任何帮助将不胜感激。
test_array = []
def collatz_sequence(number)
return number if number==1
if number%2==0
test_array << number
return collatz_sequence(number/2)
else
test_array << number
return collatz_sequence(3*number+1)
end
end
puts collatz_sequence(13)
答案 0 :(得分:2)
test_array = []
超出了范围。 def
会创建一个新范围,因此您无法从该方法中访问test_array
的值。
解决此问题的一种方法是使test_array
成为实例变量:@test_array
答案 1 :(得分:1)
局部变量不能使范围超出方法定义。改为使用实例变量。
@test_array = []
def collatz_sequence(number)
return 1 if number == 1
@test_array << number
collatz_sequence(number.even? ? number / 2 : 3 * number + 1)
end
collatz_sequence(13) # => 1
@test_array # => [13, 40, 20, 10, 5, 16, 8, 4, 2]
但是我没有看到最后回归1的重点。在@test_array
中包含它更有意义:
@test_array = []
def collatz_sequence(number)
@test_array << number
collatz_sequence(number.even? ? number / 2 : 3 * number + 1) unless number == 1
end
collatz_sequence(13)
@test_array # => [13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
但这不是一个好习惯,因为该方法的数组和过程具有依赖性。更好的方法是:
def collatz_sequence(number, test_array = [])
return if number == 1
collatz_sequence(number.even? ? number / 2 : 3 * number + 1, test_array)
end
collatz_sequence(13)
答案 2 :(得分:1)
这个实现怎么样:
def collatz_sequence(number)
array = [number]
if number%2==0
array += collatz_sequence(number/2)
elsif number != 1
array += collatz_sequence(3*number+1)
end
return array
end
puts collatz_sequence(13)