2016-07-17 12 views
1

Я пытаюсь решить самую длинную проблему палиндром в Ruby, и я нашел ответ на StackOverflow:Рубин длинный палиндром

ОТВЕТ:

Предположим, что строка имеет п символов. Сначала посмотрите, является ли целая строка палиндром. Если это так, верните строку. Фини! Если нет, посмотрите, является ли одна из двух подстрок длины n-1 палиндром. Если это так, верните его. Если нет, изучите подстроки длины n-2 и т. Д. Пока строка содержит хотя бы одну букву, будет найден самый длинный палиндром.

def longest_palindrome(str) 
    arr = str.downcase.chars 
    str.length.downto(1) do |n| 
    ana = arr.each_cons(n).detect { |b| b == b.reverse } 
    return ana.join if ana 
    end 
end 

puts longest_palindrome "ilikeracecar" 

Но у меня возникают проблемы с пониманием этой линии:

return ana.join if ana 

Что

if ana 

означает?

Также почему бы не работать?

def longest_palindrome(str) 
    arr = str.downcase.chars 
    str.length.downto(1) do |n| 
    ana = arr.each_cons(n).detect { |b| b == b.reverse } 
    return ana.join 
    end 
end 

Когда я запускаю это, он дает мне

undefined method `join' for nil:NilClass (NoMethodError) 

Но я не понимаю, почему ана будет ноль, когда я обнаружил первый массив, который удовлетворяет условию, которое было бы [» r "," a "," c "," e "," c "," a "," r "], так ли это должно быть в ana?

ответ

3

Каждый раз, когда этот код работает:

ana = arr.each_cons(n).detect { |b| b == b.reverse } 

ana получает новое значение. detect либо вернет первый элемент, являющийся палиндром, либо nil. Таким образом, в случае, когда n является такой длиной, что нет палиндрома, ana будет nil.

return ana.join if ana 

означает "если ana верно (например, не ноль), возвращение ana.join". В вашем модифицированном коде иногда ana есть nil, и вы все равно пытаетесь сделать join.

Это может быть проще понять код, если вы добавите протоколирования:

def longest_palindrome(str) 
    arr = str.downcase.chars 
    str.length.downto(1) do |n| 
    puts "n = #{n}" 
    ana = arr.each_cons(n).detect { |b| b == b.reverse } 
    if ana == nil then 
     puts "ana is nil" 
    else 
     puts "ana = #{ana.join}" 
    end 
    return ana.join if ana 
    end 
end 

puts longest_palindrome('a racecar') 

Выход:

n = 9 
ana is nil 
n = 8 
ana is nil 
n = 7 
ana = racecar 
racecar 

Как вы можете видеть, ana является nil, пока вы не получите до размера 7.

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

  • Нет связанных вопросов^_^