【问题标题】:Why can't I push the function parameter into an array?为什么我不能将函数参数推送到数组中?
【发布时间】:2013-08-04 09:31:24
【问题描述】:

我试图找出这个 collat​​z 序列的长度。如果我将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)

【问题讨论】:

    标签: ruby function collatz


    【解决方案1】:

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

    解决此问题的一种方法是将test_array 设为实例变量:@test_array

    【讨论】:

      【解决方案2】:

      局部变量的作用域不能超出方法定义。请改用实例变量。

      @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)
      

      【讨论】:

      • 谢谢大家!我接受了这个答案,因为它是最长的,但每个人都很乐于助人。非常感谢!
      【解决方案3】:

      这个实现怎么样:

          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)
      

      【讨论】:

        猜你喜欢
        • 2019-02-12
        • 2017-12-28
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        相关资源
        最近更新 更多