Там нет ничего такого мишечного и полезного для интервью JavaScript, чем рекурсия.
Если вы просто хотите быть впечатляющими с рекурсией в JavaScript, вот несколько примеров Semi Real-World (Teacic Test Test Test).
Краткое определение рекурсивного решения проблемы (в информатике): не используйте итерацию. Это обычно означает, что функция должна позвонить себе с меньшим экземпляром той же проблемы. Это делает это, пока оно попадает в тривиальный случай (обычно определено в проблеме).
Следовательно, рекурсия состоит из нескольких шагов.
В этом посте мы обсудим:
- ? Рекурсия для завершения последовательных HTTP-запросов
- ? Количество символов
Примеры этого поста также на Obervablehq. , который является супер прохладным инструментом, который позволяет создавать ноутбуки JavaScript:
Скажем, вам нужно получить несколько страниц из API для отдыха, и вы вынуждены использовать нативный модуль HTTPS ( Пример здесь ). В этой ситуации мы получим комментарии от Reddit API.
С помощью этой API:
- Если есть больше комментариев, чем в соответствии с одним ответом, он вернет
послеполе в данных. Это может быть использовано в качестве параметра запроса в запросе, чтобы получить следующий кусок комментариев - Если больше комментариев больше нет,
послебудет фальсию
Это определяет наши прекрасные и рекурсивные случаи. Мы исчерпываем данные из API Reddit, а затем либо:
послеэто фальсию → Захватывающий случай вернуть данныепослеопределяется → Рекурсивный случай пропустите его, чтобы получить следующую страницу, а также данные, возвращаемые из текущего вызова
Один из хитростей, используемых здесь, передает пустую данные массив в RecursiveCommentFetch Функция с первого прохода. Это позволяет нам продолжать вводить все больше и больше ценностей, поскольку мы проходим через каждый рекурсивный вызов. Мы можем разрешить полный набор в заканчивом случае.
const fetch = require('node-fetch');
const user = 'hugo__df';
function makeRedditCommentUrl(user, queryParams) {
return `https://www.reddit.com/user/${user}/comments.json?${
Object.entries(queryParams)
.filter(([k, v]) => Boolean(v))
.map(
([k, v]) => `${k}=${v}`
).join('&')
}`;
}
function recursiveCommentFetch(user, data = [], { after, limit = 100 } = {}) {
const url = makeRedditCommentUrl(user, { after, limit });
return fetch(url)
.then(res => res.json())
.then(res => {
const { after, children } = res.data;
const newData = [...data, ...children];
if (after) {
// recursive case, there's a way to fetch more comments
return recurseCommentFetch(user, newData, { after });
}
// base or terminating case
return newData;
});
}
recursiveCommentFetch(user)
.then(comments => console.log(comments));Я знакомился с этим API, создав следующую визуализацию для взносов Reddit (в стиле графика вклада Github). Посмотрите здесь Отказ Версия для блога тоже живет .
Когда вопрос идет что-то подобное: «Учитывая вход, вернуть объект, содержащий, сколько раз каждый символ присутствует на входе», – вы будете использовать этот метод.
Есть Живая демонстрация здесь Отказ
Захватывающий и рекурсивный случай не сразу очевиден, поэтому здесь есть несколько шашек:
- Понимание того, что вход можно бросить в строку, которая может быть
.splitв массив (т.е. Самый произвольный вход может быть преобразован в массив). - Зная, как резать через массив. Это, вероятно, одно из самых простых/наиболее распространенных вещей, чтобы пройти. Но пару раз берется на то, чтобы начать чувствовать себя комфортно.
Это дает нам следующую ситуацию для рекурсивной функции:
- Список/массив символов пусто → Захватывающий случай вернуть
Характертологакарта - Список/массив символов не пусты → Рекурсивный случай обновите
HASTARCETOCOUNTMAPПри увеличении/инициализации входа текущего характера. Позвоните в рекурсивную функцию с обновленной картой и остальной частью списка/массива.
Я написал более полный пост: Рекурсия в JavaScript с ES6, разрушимостью и отдыхом/распространением , который входит в более подробную информацию (примеры и методы) о том, как мы можем резать через списки (массивы) в JavaScript ES6. Это объясняет такие вещи, как [FirstCharacter, ... отдых] Обозначение.
function recurseCountCharacters(
[firstCharacter, ...rest],
characterToCountMap = {}
) {
const currentCharacterCount = characterToCountMap[firstCharacter] || 0;
const newCharacterToCountMap = {
...characterToCountMap,
[firstCharacter]: currentCharacterCount + 1
};
if (rest.length === 0) {
// base/terminating case
// -> nothing characters left in the string
return newCharacterToCountMap;
}
// recursive case
return recurseCountCharacters(rest, newCharacterToCountMap);
}
function countCharacters(input) {
return recurseCountCharacters(String(input).split(''));
}
console.log(countCharacters(1000000));
// { "0":6, "1": 1 }
console.log(countCharacters('some sentence'));
// { "s":2,"o":1,"m":1,"e":4," ":1,"n":2,"t":1,"c":1}Вот как вы верите через интервью, используя рекурсию?, Бегинные круги вокруг этих игрушечных проблем.
Рекурсивные решения для собеседования проблемы в конечном итоге выглядят охладителю и более чистые, чем итеративные. Они интервьюера глаз-конфеты.
Для любых вопросов вы можете связаться со мной в Twitter @hugo__df Отказ
Получите все сообщения недели, прежде чем кто-либо еще в вашем почтовом ящике: Код с бюллетенью Hugo Отказ
Оригинал: “https://www.freecodecamp.org/news/how-to-impress-interviewers-by-using-recursion-in-javascript-with-es6-features-a14c763110d7/”