Почему эта функция не завершается после первой итерации?

1

Я понимаю, как работает следующая функция. НО почему он не выходит после первой итерации (когда есть палиндром)? Он проверяет первый символ против последнего в выражении if, который является истинным, что должно (в моей логике) выполнить оператор return... Спасибо за любую помощь, объясняющую это! :)

function palindrome(str) {
  var lowerCaseStr = str.toLowerCase();
  for (var i = 0; i < lowerCaseStr.length; i++)
  debugger;
    if (lowerCaseStr[i] === lowerCaseStr[lowerCaseStr.length - i - 1]){
      return true;
    }
  return false;
}
  • 1
    Кстати, вы перебираете только debugger .
Теги:
function
palindrome
return

2 ответа

0
Лучший ответ

Вам нужно переключить логику, проверить неравенство и вернуть false. Если вы достигнете конца, верните true.

function palindrome(str) {
    var lowerCaseStr = str.toLowerCase();
    for (var i = 0; i < lowerCaseStr.length; i++) {
        debugger;
        if (lowerCaseStr[i] !== lowerCaseStr[lowerCaseStr.length - i - 1]) {
            return false;
        }
    }
    return true;
}
  • 0
    1. Почему это отличается от моего пути? и 2. Вернемся к моему вопросу: почему функция (цикл) не останавливается после сравнения первых двух символов? БЛАГОДАРЮ ВАС!
  • 0
    он отличается для проверки не на равенство, а на неравенство, и возвращаемое значение также переключается, true становится false и наоборот. вы выходите с первым найденным персонажем, но вам нужно проверить не сходство, а неравенство.
2

Он не выходит после первой итерации, но после итераций lowerCaseStr.length потому что ваш код эквивалентен коду ниже

function palindrome(str) {
  var lowerCaseStr = str.toLowerCase();
  for (var i = 0; i < lowerCaseStr.length; i++){ 
      debugger;
  }

  if (lowerCaseStr[lowerCaseStr.length] === lowerCaseStr[-1]){
      return true;
  }

  return false;
}

то есть он выполняет lowerCaseStr.length; но единственное, что он делает для каждой итерации, - это debugger вызова, после чего он проверяет элементы в массиве, который не существует. (Оба индекса находятся за пределами границ). Это приводит к сопоставлению двух раз undefined undefined === undefined которые всегда верны.

В качестве бокового узла, если вы вернете либо true, либо false в зависимости от логического выражения, тогда вместо этого используйте один оператор return:

return (lowerCaseStr[i] === lowerCaseStr[lowerCaseStr.length - i - 1]);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню