Найдено результатов: 3

Оценка экспрессии и Хождение по деревьям с использованием полиморфизма? (Ала Стив Егге)

Сегодня утром я читал книгу Стива Йегге "когда полиморфизм терпит неудачу", когда наткнулся на вопрос, который его коллега обычно задавал потенциальным сотрудникам, когда они приходили на собеседование в Amazon.

Как пример полиморфизма в действие, давайте посмотрим на классику "eval" вопрос интервью, который (как насколько я знаю) был доведен до Amazon автор: Рон Браунштейн. Вопрос в том довольно богатый, как ему удается зондируйте большое разнообразие важных навыки: OOP дизайн, рекурсия, двоичный код деревья, полиморфизм и время выполнения набор текста, общие навыки кодирования и (если вы хотите сделать его еще более трудным) теория парсинга.

В какой-то момент кандидат с надеждой осознает, что вы можете представлять собой арифметическое выражение в двоичном виде дерево, предполагая, что вы только используете бинарные операторы, такие как" +", "-", "* " ,"/". Листовые узлы - это все числа, а внутренние узлы являются все операторы. Оценка состояния выражение означает ходить по дереву. Если кандидат этого не понимает, вы можете мягко привести их к этому, или если это необходимо, просто скажи им.

Даже если ты расскажешь им, это все равно будет неприятно. интересная проблема.

Первая половина вопроса, которая некоторые люди (чьи имена я буду называть защищать до последнего вздоха, но их инициалы-Вилли Льюис) feel is a Требования К Работе, Если Вы Хотите Позвонить Вы Сами Разработчик И Работаете На Amazon, на самом деле довольно сложно. То вопрос заключается в следующем: как вы идете от Ан арифметическое выражение (например, в a строку), такие как "2 + (2)" к дерево выражения. У нас может быть ADJ вызов по этому вопросу у некоторых точка.

Вторая половина такова: допустим, это проект из 2 человек и ваш партнер, кого мы будем называть "Willie", это ответственный за преобразование строковое выражение в дереве. Вы получаете самая простая часть: вам нужно решить, что именно классы Вилли должен построить дерево С. Вы можете сделать это в любом случае язык, но убедитесь, что вы выбираете один, или Вилли вручит тебе assembly язык. Если он чувствует себя раздраженным, то это будет для процессора то есть нет дольше производится в производстве.

Вы были бы поражены, узнав, сколько кандидатов БОФФ вот этот.

Я не буду давать вам ответ, но ... Стандартное плохое решение предполагает использование состояния переключателя или случая (или просто доброе старомодное каскадное "если"). Один Немного лучшее решение включает в себя использование таблицы указателей функций, и вероятно лучшее решение предполагает использование полиморфизма. Я рекомендуем вам работать через него иногда. Забавная штука!

Итак, давайте попробуем решить эту проблему всеми тремя способами. Как перейти от арифметического выражения (например, в строке), такого как "2 + (2)", к дереву выражений, используя каскадные if, таблицу указателей функций и / или полиморфизм?

Не стесняйтесь решать один, два или все три вопроса.

[update: заголовок изменен, чтобы лучше соответствовать тому, что было в большинстве ответов.]

oop   recursion   polymorphism   binary-tree    

533   16   03:31, 22nd August, 2020


Есть ли способ ускорить рекурсию, запоминая дочерние узлы?

Например, Посмотрите на код, который вычисляет число Фибоначчи n-th :

fib(int n)
{
    if(n==0 || n==1)
        return 1;
    return fib(n-1) + fib(n-2);
}

Проблема с этим кодом заключается в том, что он будет генерировать ошибку переполнения стека для любого числа больше 15 (в большинстве компьютеров).

Предположим, что мы вычисляем fib(10). В этом процессе, скажем, fib (5) вычисляется много раз. Есть ли способ сохранить это в памяти для быстрого извлечения и тем самым увеличить скорость рекурсии?

Я ищу общий метод, который может быть использован практически во всех проблемах.

performance   recursion    

650   18   14:10, 1st August, 2020


Найдите количество файлов с определенным расширением во всех подкаталогах

Есть ли способ найти количество файлов определенного типа без необходимости перебирать все результаты с помощью Directory.GetFiles() или аналогичного метода? Я ищу что-то вроде этого:

int ComponentCount = MagicFindFileCount(@"c:\windows\system32", "*.dll");

Я знаю , что могу сделать рекурсивную функцию для вызова Directory.GetFiles, но было бы намного чище, если бы я мог сделать это без всех итераций.

EDIT: если это невозможно сделать без рекурсии и повторения самого себя, то как это лучше всего сделать?

c#   file   recursion    

402   7   23:04, 26th August, 2020