2015-02-13 2 views
0

Я пишу метод, который возвращает значение рано. Я знаю, как писать по-другому, но я хотел бы понять, почему его запись таким образом возвращает неверное значение. Я пытаюсь получить «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

он продолжает возвращаться 1.

  1. ДО() определяется, чтобы вернуть левую часть.

  2. В общем случае метод возвращает значение последнего оператора, который был выполнен - ​​операторы возврата не требуются.

Последний оператор в PrimeMover() - это вызов метода 1.upto(). Обратите внимание, что блок похож на определение метода, и блок фактически направлен метода ДО() в качестве аргумента, что-то вроде этого:

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

Поэтому, если ДО() выполняется до завершения возвращаемого значения of primeMover() будет возвращать все upto().

Даже если isprime?() возвращает истину каждый раз, 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 
+0

Да, и «раннее возвращение» фактически никогда не достигнуты потому что вы ищете только от 1 до N для Nth prime, а Nth prime обычно будет намного больше N. Вы должны искать большее пространство. Вероятно, вы должны использовать бесконечный цикл вместо использования upto. –

Смежные вопросы