Выход из рекурсии

181
31 октября 2018, 16:20

Не могу выйти из рекурсии

function consoleRec(sourse) { 
 
  console.log(sourse.shift()); 
  consoleRec(sourse); 
 
} 
consoleRec(['я', 'умею', 'писать', 'рекурсивные', 'функции']);

Условие: Запрещено использовать циклы и методы для работы с массивами. Функция должна принимать два аргумента: массив и… что-то еще. Что именно - остается на ваше усмотрение.

Пример вызова:

consoleRec(['я', 'умею', 'писать', 'рекурсивные', 'функции'], ???);

Должна вывести на экран:

я
умею
писать
рекурсивные
функции
Answer 1

Реализация рекурсивного алгоритма всегда должна содержать в себе:

  • Рекуррентное отношение
    Это то, каким образом мы сводим решение задачи к решению задач меньшего размера.
  • Крайние случаи
    Это то, что поможет нам вовремя остановиться, некие тривиальные случаи, которые можно решить на месте, не прибегая к разбиению задачи на подзадачи.

В своей реализации вы забыли про второе.

function consoleRec(src) { 
  if (src.length === 0) return; // крайний случай, пустой массив 
  console.log(src.shift());     // действие текущей итерации 
  consoleRec(src);              // рекурсивный вызов для уменьшенного массива 
} 
consoleRec(['я', 'умею', 'писать', 'рекурсивные', 'функции']);

Обращаясь к условию Вашей задачи

Запрещено использовать циклы и методы для работы с массивами

мы не можем изменять исходный массив(или срезать его части), поэтому вторым параметром придётся передать текущий размер задачи:

/* Передача размера задачи  
 */ 
function r1(src, taskSize) { 
  if (taskSize === 0) return; 
  r1(src, taskSize-1); 
  console.log(src[taskSize-1]); 
} 
 
/* Передача индекса начала необработанной части массива  
 */ 
function r2(src, start) { 
  if (start === src.length) return; 
  console.log(src[start]); 
  r2(src, start + 1);   
} 
 
 
let list = ['я', 'умею', 'писать', 'рекурсивные', 'функции']; 
 
r1(list, list.length); 
r2(list, 0);

Answer 2

Не могу выйти из рекурсии

Вот так можно это реализовать:

function consoleRec(source, i) { 
  // Условие для выхода 
  if (source.length - 1 >= i) { 
    // Печать 
    console.log(source[i]); 
    // Вызов рекурсии 
    consoleRec(source, i + 1) 
  } 
} 
 
consoleRec(['я', 'умею', 'писать', 'рекурсивные', 'функции'], 0);

Answer 3

void function r(f, arr, i = 0) { f(arr[i]) || i++ < arr.length - 1 && r(f, arr, i) }(console.log, ['я', 'умею', 'писать', 'рекурсивные', 'функции'])

к стати, в условии задачи не сказано про рекурсию

let f = (a, b) => b(('' + a).replace(/,/g, '\n')) 
f(['я', 'умею', 'писать', 'рекурсивные', 'функции'], console.log)

READ ALSO
Посчитать значение всех input type=&ldquo;time&rdquo;

Посчитать значение всех input type=“time”

помогите посчитать значения всех inputПробовал преобразовать значение инпут с помощью parseInt, считает некорректно

159
Как использовать setInterval для скрытия/показа div?

Как использовать setInterval для скрытия/показа div?

как сделать через setInterval так что-бы одинdiv исчезал (например через 5 секунд) и по исчезновению первого

153
Предотвратить click()

Предотвратить click()

На сайте есть квест, в рандомное время появляется попап, и кто первый кликнет получает приз Но некоторые люди использую через консоль поиск...

124
Проверка classList.contains

Проверка classList.contains

Есть div'ыПри нажатии на них добавляется class="clicked"

193