1

このコラッツ シーケンスの長さを見つけようとしています。に変更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)
4

3 に答える 3

2

test_array = []は対象外です。メソッド内で fromdefの値にアクセスできないように、新しいスコープを作成します 。test_array

これを回避する 1 つの方法はtest_array、インスタンス変数を作成することです。@test_array

于 2013-08-04T09:47:59.483 に答える
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 に答える
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 に答える