价值保持早期回归

时间:2015-02-13 06:15:12

标签: ruby return-value primes

我正在编写一种能够尽早返回值的方法。我知道如何以不同的方式编写,但我想理解为什么以这种方式编写它会导致返回错误的值。我试图获得" nth"素数,以下方法似乎有效,并且没有错误,但它一直返回1.在下面,我甚至使用了" p"函数确保每次都找到count和int递增,但无论出于何种原因,我得到的返回值是1,或者我称之为upto方法的任何值。关于为什么会这种情况发生的任何指示或解释都将非常受欢迎。

def primeMover(num)
    count = 0  
    1.upto(num) do |int|
      return int if count == num
      count += 1 if is_prime?(int)
    end          
end

def is_prime?(number)  
  return false if number < 2
  2.upto(Math.sqrt(number)) { |divisor| return false if number % divisor == 0 }  
  return true 
end

1 个答案:

答案 0 :(得分:1)

  

它一直返回1.

  1. upto()定义为返回左侧。

  2. 通常,方法返回最后执行的语句的 - 不需要return语句。

  3. primeMover()中的最后一个语句是方法调用1.upto()。请注意,块类似于方法定义,并且块实际上作为参数发送到upto()方法,如下所示:

     1.upto(3, proc{|int| ...})
    

    因此,如果upto()运行完成,则primeMover()的返回值将是upto()返回的任何值。

    即使isprime?()每次都返回true,return int也永远不会执行:

    def primeMover(num)
        count = 0  
    
        1.upto(num) do |int|
          return int if count == num
          count += 1   #mimicking is_prime()? returning true every time
        end          
    end
    
    result = primeMover(3)
    puts result
    
    --output:--
    1
    

    那是因为你增加计数太晚了:

    def primeMover(num)
        count = 0  
        puts "num = #{num}"
    
        1.upto(num) do |int|
          puts int
    
          return int if count == num
          puts "int = #{int}, count = #{count}"
    
          count += 1 
          puts count
    
          puts '-' * 10
        end          
    end
    
    result = primeMover(3)
    puts '=' * 10
    puts result
    
    --output:--
    num = 3
    1
    int = 1, count = 0
    1
    ----------
    2
    int = 2, count = 1
    2
    ----------
    3
    int = 3, count = 2
    3
    ----------
    ==========
    1