1

我试图找到这个 collat​​z 序列的长度。如果我更改test_array << numberputs 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)
4

3 回答 3

2

test_array = []超出范围。def创建一个新范围,因此您无法 test_array从方法中访问 的值。

解决此问题的一种方法是创建test_array一个实例变量:@test_array

于 2013-08-04T09:47:59.483 回答
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)
于 2013-08-04T09:48:19.747 回答
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)
于 2013-08-04T10:04:40.343 回答