2014-03-21 3 views
-2
def longest_collatz_sequence(n) 
    longest_sequence = [] 
    (1..n).each do |a| 
     sequence = [a] 
     until sequence.last == 1 
      if a % 2 == 0 
       sequence.push(a/2) 
      else 
       sequence.push(3a + 1) 
      end 
     end 
     if sequence.length > longest_sequence.length 
      longest_sequence = sequence 
     end 
    end 
    longest_sequence 
end 

longest_collatz_sequence (100)Поиск самой длинной последовательности Коллатца для запуска числа <100

При запуске алгоритма, я сказал, что есть неожиданный идентификатор в пределах 3a +-и программа не запустить. Где моя проблема?

Спасибо!

+0

для этого вы задали вопрос в SO .. :) Если вы попробуете в IRB, вы можете помочь вам. –

ответ

1

Сделайте это 3*a, вы исключили фактическое умножение.

+0

Спасибо! Не могу поверить, что я пропустил это. Алгоритм работает для 2, но не для n> 2. Знаете ли вы, почему? @pjs – megashigger

+1

@ user2469211 Это другой вопрос. Пожалуйста, задайте новый вопрос, если вы не можете решить его самостоятельно –

-2
def seq(num) 
    tryied = [] 
    highest_count = 0 
    highest = nil 
    highest_seq = nil 
    element = nil 
arr = (1..num).to_a 
arr = arr.reverse 
arr.each { |el| 

if seq_count(el) > highest_count && !tryied.include?(el) 
    highest_count = seq_count(el) 
    highest = el 
    highest_seq = seq_arr(el) 
    tryied.concat(seq_arr(el)) 
    end 
} 
p highest 
p highest_count 
p highest_seq 


end 









def seq_count(num) 
    temp = num 
    count = 1 

until temp == 1 do 
    if temp.even? 
    temp = temp/2 
    count += 1 
    elsif temp.odd? 
    temp = (3*temp) + 1 
    count += 1 
    end 
end 
    count 
end 

def seq_arr(num) 
    temp = num 
    arr = [] 
    arr << temp 

until temp == 1 do 
    if temp.even? 
    temp = temp/2 
    arr << temp 
    elsif temp.odd? 
    temp = (3*temp) + 1 
    arr << temp 
    end 
end 
    arr 
end 

seq(1000000) 
Смежные вопросы