Результаты поиска
Оценка экспрессии и Хождение по деревьям с использованием полиморфизма? (Ала Стив Егге)
Сегодня утром я читал книгу Стива Йегге "когда полиморфизм терпит неудачу", когда наткнулся на вопрос, который его коллега обычно задавал потенциальным сотрудникам, когда они приходили на собеседование в Amazon.
Как пример полиморфизма в действие, давайте посмотрим на классику "eval" вопрос интервью, который (как насколько я знаю) был доведен до Amazon автор: Рон Браунштейн. Вопрос в том довольно богатый, как ему удается зондируйте большое разнообразие важных навыки: OOP дизайн, рекурсия, двоичный код деревья, полиморфизм и время выполнения набор текста, общие навыки кодирования и (если вы хотите сделать его еще более трудным) теория парсинга.
В какой-то момент кандидат с надеждой осознает, что вы можете представлять собой арифметическое выражение в двоичном виде дерево, предполагая, что вы только используете бинарные операторы, такие как" +", "-", "* " ,"/". Листовые узлы - это все числа, а внутренние узлы являются все операторы. Оценка состояния выражение означает ходить по дереву. Если кандидат этого не понимает, вы можете мягко привести их к этому, или если это необходимо, просто скажи им.
Даже если ты расскажешь им, это все равно будет неприятно. интересная проблема.
Первая половина вопроса, которая некоторые люди (чьи имена я буду называть защищать до последнего вздоха, но их инициалы-Вилли Льюис) feel is a Требования К Работе, Если Вы Хотите Позвонить Вы Сами Разработчик И Работаете На Amazon, на самом деле довольно сложно. То вопрос заключается в следующем: как вы идете от Ан арифметическое выражение (например, в a строку), такие как "2 + (2)" к дерево выражения. У нас может быть ADJ вызов по этому вопросу у некоторых точка.
Вторая половина такова: допустим, это проект из 2 человек и ваш партнер, кого мы будем называть "Willie", это ответственный за преобразование строковое выражение в дереве. Вы получаете самая простая часть: вам нужно решить, что именно классы Вилли должен построить дерево С. Вы можете сделать это в любом случае язык, но убедитесь, что вы выбираете один, или Вилли вручит тебе assembly язык. Если он чувствует себя раздраженным, то это будет для процессора то есть нет дольше производится в производстве.
Вы были бы поражены, узнав, сколько кандидатов БОФФ вот этот.
Я не буду давать вам ответ, но ... Стандартное плохое решение предполагает использование состояния переключателя или случая (или просто доброе старомодное каскадное "если"). Один Немного лучшее решение включает в себя использование таблицы указателей функций, и вероятно лучшее решение предполагает использование полиморфизма. Я рекомендуем вам работать через него иногда. Забавная штука!
Итак, давайте попробуем решить эту проблему всеми тремя способами. Как перейти от арифметического выражения (например, в строке), такого как "2 + (2)", к дереву выражений, используя каскадные if, таблицу указателей функций и / или полиморфизм?
Не стесняйтесь решать один, два или все три вопроса.
[update: заголовок изменен, чтобы лучше соответствовать тому, что было в большинстве ответов.]
Есть ли способ ускорить рекурсию, запоминая дочерние узлы?
Например, Посмотрите на код, который вычисляет число Фибоначчи n-th :
fib(int n)
{
if(n==0 || n==1)
return 1;
return fib(n-1) + fib(n-2);
}
Проблема с этим кодом заключается в том, что он будет генерировать ошибку переполнения стека для любого числа больше 15 (в большинстве компьютеров).
Предположим, что мы вычисляем fib(10). В этом процессе, скажем, fib (5) вычисляется много раз. Есть ли способ сохранить это в памяти для быстрого извлечения и тем самым увеличить скорость рекурсии?
Я ищу общий метод, который может быть использован практически во всех проблемах.
Найдите количество файлов с определенным расширением во всех подкаталогах
Есть ли способ найти количество файлов определенного типа без необходимости перебирать все результаты с помощью Directory.GetFiles() или аналогичного метода? Я ищу что-то вроде этого:
int ComponentCount = MagicFindFileCount(@"c:\windows\system32", "*.dll");
Я знаю , что могу сделать рекурсивную функцию для вызова Directory.GetFiles, но было бы намного чище, если бы я мог сделать это без всех итераций.
EDIT: если это невозможно сделать без рекурсии и повторения самого себя, то как это лучше всего сделать?