Как мне объяснить последнюю строку третьей стороне

#javascript #function #recursion

#javascript #функция #рекурсия

Вопрос:

В этом коде есть что-то такое, что мне трудно объяснить третьей стороне. Какова логика вычитания 2 из n при рекурсивном вызове нашей функции?

 function is_even(n) {
    if (n<0) {
        return Math.abs(n) 
    }
    if (n=== 0) {
        return true;
    } else if (n === 1) {
        return false;
    } else {
        return is_even(num - 2);
    }
}

console.log(is_even(8));
  

Комментарии:

1. Он снова запускает функцию с новым аргументом.

2. Он выдает ошибку, потому что num не существует, вот как я бы все равно это объяснил.

3. Также для отрицательного бита, я полагаю, вы хотели сделать -> return is_even(Math.abs(n))

Ответ №1:

Итак, логика здесь в том, что вы в принципе можете сказать, что что-то нечетное или четное, вычитая из него 2, пока оно не станет 0 или 1.

Вы вычитаете 2, потому что, если вы вычтете что-то еще, вы можете превысить и получить отрицательное число. Вычитая два, вы всегда получите либо 1, либо 0, независимо от того, с какого числа вы начинаете.

Если вы начнете с 9

 is_even(9)
9 - 2 = 7 | is_even(7)
7 - 2 = 5 | is_even(5)
5 - 2 = 3 | is_even(3)
3 - 2 = 1  => 1 indicates it is odd and the function will return
  

Возможно, хорошим способом объяснить третьей стороне было бы написать несколько примеров, подобных приведенным выше.

Ответ №2:

Я думаю, что ваша функция is_even нуждается в некоторой настройке, чтобы работать должным образом:

 function is_even(n) {
    if (n < 0) {
        n = Math.abs(n)

    } if (n === 0) {
        return true;

    } else if (n === 1) {
        return false;
    }
    else {
        return is_even(n - 2);
    }
}
  

функция проверяет только две вещи, если это 0, то возвращает True, если это 1, возвращает False .

Если вы являетесь чем-либо, что больше 0 или 1, например, 2,3,4,5,6,7,8,…

Рекурсивный характер оператора else означает: вы всегда можете вычесть 2 раза до любого положительного числа, чтобы оно стало 0 или 1.

Это та же логика, что и при делении любого числа на 2, ваш остаток всегда равен 0 или 1, если оно равно 0, то число четное, если оно равно 1, то число нечетное.

Ответ №3:

Вы продолжаете вычитать 2, пока n не станет 1 или 0. Если оно равно 0, оно четное, а если равно 1, оно нечетное. Вычитая на 2, вы в значительной степени просто находите остаток от n / 2.

 function is_even(n) {
    if(n<0){
        return Math.abs(n) 
    } 
    if (n=== 0) {
        return true;
    }
    else if (n === 1) {
        return false;
    }
    else {
        return is_even(n - 2);
    }
}


console.log(is_even(8));
  

Ответ №4:

Во-первых, строка должна быть:

 return is_even(n - 2);
  

вместо

 return is_even(num - 2);
  

Переходим к объяснению:

Учитывая число n, функция продолжает вычитание 2 из числа до тех пор, пока остаток не станет отрицательным, 0 или 1. Если число нечетное, то при последующем вычитании 2 оно вернет 1. Если оно четное, то остаток будет равен 0. Если число меньше 2, то остаток будет отрицательным. Смысл повторного вызова функции состоит в том, чтобы продолжать рекурсивно вычитать 2, пока конечное значение не станет либо 0,1, либо отрицательным.

Когда передается отрицательное значение, оно возвращает абсолютное значение вместо определения четного или нечетного.

  • На первой итерации -> n = 8 функция вызывается снова.
  • На следующей итерации -> n = 6, т.е. (8-2), функция вызывается снова.
  • На следующей итерации -> n = 4, т.е. (6-2), функция вызывается снова.
  • На следующей итерации -> n = 2, т.е. (4-2), функция вызывается снова.
  • На следующей итерации -> n = 0, т.е. (2-2), функция останавливается и возвращает true .

Ответ №5:

is_num — это рекурсивная функция, функция, которая вызывает саму себя во время выполнения. Теперь, когда вы пишете «return is_even(num — 2);», вы отправляете аргумент, который на 2 единицы меньше исходного значения, которое равно num . после возврата is_even(num — 2);… is_even будет вызван снова, но значение параметра n будет меньше на 2 единицы.

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

для получения дополнительной информации вы можете обратиться по этой ссылке