Вы не «сломаться» из рекурсивных функций. Попытка сделать это говорит, что вы думаете о них не так. В настоящее время ваш рекурсивный вызов игнорирует вывод, а это означает, что рекурсия бессмысленна; независимо от того, что is_pal(middle(str))
возвращает, не влияет на возвращаемое значение вашей функции.
Рекурсивный алгоритм решает проблему ввода, разлагая проблему на меньшую задачу, решая результирующее решение меньшей задачи, а затем используя меньшее решение для построения правильного решения более крупной задачи. Вы не «ломаете» внутренние вызовы, вы возвращаете решение на один уровень. Вы не знаете (или должны знать), должны знать, находитесь ли вы во внутреннем вызове или на верхнем уровне. В любом случае ваша функция должна делать то же самое: return True, если аргумент является палиндром и False, если это не так.
алгоритм вы пытаетесь реализовать в основном это:
- Если строка имеет длину 1, это палиндром (вернуть True)
- В противном случае, если первый символ такой же, как последний символ, тогда вход является палиндром, если средние символы являются палиндром.
Так что это означает, что как только вы установили первые и последние символы совпадают, то ответ на «мой вход палиндром» является точно так же как ответ на «являются средними персонажи палиндром ". Вы должны вернуть ответ, чтобы выполнить свой контракт. Таким образом, рекурсивный вызов должен быть return is_pal(middle(str))
, а не только is_pal(middle(str))
. Если это был вызов верхнего уровня, тогда это ответ; если этот не был вызовом верхнего уровня, тогда внешнему вызову понадобится этот ответ, чтобы выработать ответ на внешнюю проблему (в этом случае, просто вернув ее).
Btw, ваш алгоритм также имеет некоторые другие проблемы.
- Вы никогда не вернуться
False
, так что ответ не может быть False
(в этом случае вам случится случайно вернуться None
падения с конца функции, если первый и последний символ не совпадает, и None
будет вероятно, в большинстве случаев занимают позицию False
, но это по-прежнему не совсем правильно).
- Если длина строки является нулевого, а не 1 (что произойдет, если пустая строка передается в или если палиндром четной длины проходит один раз все пары одинаковых первых и последних символы, извлекают), то вы не вернете правильный ответ, и на самом деле вы пытаетесь получить первый и последний символ пустой строки, что вызовет исключение.
@ li.davidm: Вы были быстрее :) – Qlaus