2016-07-17 3 views
1

내가 루비에서 가장 긴 회문 문제를 해결하기 위해 노력하고있어, 나는 유래에 대한 답을 발견루비 긴 회문

답변 :

문자열이 n 개의 문자가 가정하자. 먼저 전체 문자열이 회문인지 확인하십시오. 맞으면 문자열을 반환합니다. 피니! 그렇지 않다면 길이 n-1의 두 하위 문자열 중 하나가 회귀 색인인지 확인합니다. 그럴 경우 반환하십시오. 그렇지 않으면 길이가 n-2 인 하위 문자열을 검사합니다. 문자열에 적어도 하나의 문자가 포함되어 있으면 가장 긴 회문이 발견됩니다.

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 if ana 
    end 
end 

puts longest_palindrome "ilikeracecar" 

하지만 문제가이 줄을 인식하지 못했습니다?

왜이 기능을 사용하지 않습니까? 나는이 프로그램을 실행할 때

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) 

을 제공하지만 아나가 nil이 될 이유가 조건 [될 것 "만나는 첫 번째 배열을 감지 한 때 이해가 안 돼요 r ","a ","c ","e ","c ","a ","r "] 이렇게 아닐까요?

답변

3

이 코드가 실행될 때마다 :

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

ana는 새로운 값을 가져옵니다. detect은 회문문 인 첫 번째 요소 또는 nil을 반환합니다. 그러므로, n이 회문이없는 길이 인 경우, ananil이 될 것입니다. "ana 해당하는 경우 (예를 들어 비 닐) ana.join을 돌려"

return ana.join if ana 

수단. 수정 된 코드에서 가끔 ananil이고, 어쨌든 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') 

출력 : 당신이 크기 7까지 얻을 때까지

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

당신이 볼 수 있듯이, ananil입니다.