Функция обратного отсчета объяснения рекурсии с несколькими методами - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь написать рекурсию, которая создаст массив обратного отсчета. Функция должна принимать массив в параметре myArray и добавлять числа от n до 1 на основе параметра n. Например, вызов этой функции с помощью n = 5 заполнит массив цифрами [5, 4, 3, 2, 1] внутри него. Ваша функция должна использовать рекурсию, вызывая себя, и не должна использовать циклы любого вида.

Кажется, есть несколько способов написания рекурсии, есть ли общепринятый и легко читаемый метод?

function countdown(myArray, n){
  if (n>=1) {
     myArray = countdown(myArray, n-1);
     myArray.unshift(n);
  }
  return myArray;
}


function countdown(myArray, n){
 if (n<=0) {
   return;
 } else {
   myArray.push(n);
   countdown(myArray,n-1);
 }
}

Если я введу countdown(myArray, 5), обе функции вернут массив с именем myArray = [5,4,3,2,1].

У нижней функции типичный базовый случай ... а у верхней функции нет? Мне удобнее писать с использованием метода bottom, но я немного растерялся, почему он работает. Не будет вызывать нижнюю функцию до тех пор, пока она не достигнет countdown(myArray,0), затем вернется и начнет возвращаться в стек. Так не начнется ли он с myArray.push(1) до того, как он вернется в стек, в результате ответ будет [1,2,3,4,5] вместо [5,4,3,2,1]?

1 Ответ

0 голосов
/ 22 октября 2019

Если вы добавите ветку else в первую функцию и переместите возврат в обе ветви (таким образом, не меняя значения):

 if (n>=1) {
   myArray = countdown(myArray, n-1);
   myArray.unshift(n);
   return myArray;
 } else {
   return myArray;
 }

Теперь инвертируйте оператор if (меняя как условие, так иветви):

 if(n <= 0) {
   return myArray; 
 } else {
   myArray = countdown(myArray, n-1);
   myArray.unshift(n);
   return myArray;
 }

Итак, как вы можете видеть, обе функции равны , так как они могут быть преобразованы i друг в друга без внесения критических изменений (однако одна из них возвращает myArrayв то время как другой нет).

Теперь , где базовый случай в первой функции? Что ж, если n равно 0 или меньше, он не входит в if и, поскольку рекурсивный вызов находится внутри ветви if s ... он не вызывает себя снова.

...