Skellig
@Skellig
Fratercula arctica

Как отличить рекурсивный вызов функции от обычного при 'use strict'?

Есть стандартная рекурсивная функция проверки строки на палиндром. При первоначальном вызове строка-аргумент должна приводиться к нижнему регистру и чиститься от пробелов. Чтобы эти действия не повторялись при каждом рекурсивном вызове, осуществляется проверка свойства caller функции.
function isPalindrome(strToCheck) {
    if(isPalindrome.caller === null || isPalindrome.caller.name != "isPalindrome") {
        strToCheck = strToCheck.toLowerCase().replace(/ /g, '');
    }

    if (strToCheck.length <= 1) {
        return true;
    }

    if (strToCheck.charAt(0) != strToCheck.charAt(strToCheck.length - 1)) {
        return false;
    }

    return isPalindrome(strToCheck.substr(1, strToCheck.length - 2));
}

Но в строгом режиме использовать caller нельзя. Можно ли реализовать этот функционал как-то иначе, не убирая 'use strict'и не заменяя рекурсию циклом?

UPD: Хотелось бы найти примерно такое же красивое и чистое решение и не плодить дополнительных параметров или функций.
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
bubandos
@bubandos
bash'у, javascript'ую, php'лю, css'аю, html'каю
Чистое и элегантное решение - отказ от рекурсии для данной конкретной задачи.
В принципе, не так много прикладных задач, в которых рекурсия бывает полезна и дает выигрыши, по сравнению с увеличением расхода памяти при рекурсии.
Функция пишется в две строчки.
function isPalindrome(strToCheck) {
     strToCheck = strToCheck.toLowerCase().replace(/[,.\-/'/"\s]/g, '');
     return strToCheck.split("").reverse() === strToCheck;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы