为什么我不能将函数参数推入数组?

时间:2013-08-04 09:31:25

标签: ruby function collatz

我正试图找到这个胶合序列的长度。如果我将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)

3 个答案:

答案 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)