2015-10-12 2 views
0

У меня есть следующие функциипалиндром функция рубина завершается без возвращаемого значения

def isPalindrome(n) 
    a = n.to_s 
    if a.length == 1 || a.length == 0 
     return true 
    else 
     first_letter = a[0] 
     last_letter = a[a.length - 1] 
     if first_letter != last_letter 
      return false 
     else 
      return isPalindrome(a[1..a.length-2].to_i) 
     end 
    end 
end 

Однако, если я даю ему какое-либо значение, оно ничего не будет возвращаться. Я уверен, что это основная ошибка, но я просто не могу видеть, где я ошибаюсь.

+2

To_i является тривиально неправильным. Проверьте значение на каждом шаге. Кроме того, с этим кодом всегда возвращается значение * a * (true или false). – user2864740

+0

to_i является тривиально неправильным, почему? «2» .to_i возвращает 2, что мне нужно? – Bula

+0

Нет, это не то, что вам нужно. Вам нужна строка. С самого начала и переходим к каждому повторению: '10201' – user2864740

ответ

1

Есть несколько способов проверить наличие палиндрома.

рекурсивный путь:

def palindrome?(n) 
    if n.length == 1 || n.length == 0 
    true 
    else 
    if n[0] == n[-1] 
     palindrome?(n[1..-2]) 
    else 
     false 
    end 
    end 
end 

Использование .reverse метода в Ruby:

def isPalindrome(n) 
n.downcase == n.reverse.downcase ? true : false 
end 

Другой способ думать о палиндром слова, разбивая строку в массив символов каждый из которых представляет позиция в списке. Например, слово «civic», разделенное на массив, дает нам ["c","i","v","i","c"]. Затем мы можем проверить, соответствует ли задний символ «c» переднему символу «c», удаляя задний и передний каждый раз, когда условие истинно.

def isPalindrome(n) 
      new_char = n.split("") 
      answer = false 
      while new_char.length > 1 
       if new_char[0] == new_char[-1] 
        answer = true 
       else 
        answer = false 
        break 
       end 
       new_char.pop 
       new_char.shift 
      end 
      answer 
     end 

Поскольку мы можем менять символы в массиве, мы можем сравнить их и продолжить, только если они совпадают. Мы можем поддерживать соответствие задней части массива, пока не закончим символы или не останемся с массивом размера 1 в зависимости от того, была ли длина исходной строки четной или нечетной.

+1

Вопрос не в том, как проверить наличие паландрома, но что не так с кодом. Что касается первого, то обычным способом является 'word.downcase == word.reverse.downcase'. –

+1

@CarySwoveland, за исключением того факта, что нам нужно игнорировать все интервалы и знаки препинания, например. «Человек, план, канал - Панама!» - это палиндром. – engineersmnky

+0

Технически вы можете обойтись без тройного оператора в вашем решении '.reverse'. –

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