Находит ли наследование из списка?
class FooCollection : List<Foo>, IList<Foo>
{
public string Bar { get; set; }
//Implement IList, ICollection and IEnumerable members...
}
"Выполнить итерации является человеческим, для рекурсивного вызова божественный" - заключенный в кавычки в 1989 в колледже.
P.S. Отправленный Woodgnome при ожидании приглашают для присоединения
@Krishna Kumar
поразрядное решение является еще большим количеством забавы, чем рекурсивное решение.
Хранение двух указателей в отдельном слове для двунаправленного связанного списка, жесткого меня урок, что можно сделать очень плохие вещи в C действительно (из-за которого консервативный GC испытает много затруднений).
Алгоритм, который генерирует список начал путем сравнения каждого числа с текущим списком начал, добавления его, если это не найдено, и возврат списка начал в конце. Изгиб Мышления несколькими способами, не наименьшее количество который, будучи идеей использовать частично завершенный вывод в качестве основных критериев поиска.
итеративный алгоритм для Fibonacci, потому что для меня это закрепило то, что самый изящный код (в этом случае, рекурсивная версия) является не обязательно самым эффективным.
повторяющийся метод, (воркуют = prev1 + prev2 в forloop) не делает дерева этот путь, и при этом это не берет в качестве большой памяти, так как это - только 3 переходных переменные вместо кадров n в стопке рекурсии.
Вы знаете, что fibonacci имеет закрытое решение для формы, которое позволяет прямое вычисление результата в постоянном числе шагов, правильно? А именно, (phi <глоток> n глоток> - (1 - phi) <глоток> n глоток>) / sqrt (5). Это всегда кажется мне несколько замечательный, что это должно привести к целому числу, но это делает.
phi является золотым сечением, конечно; (1 + sqrt (5)) / 2.
Эти алгоритм Ханойских башен является одним из самых красивых алгоритмов. Это показывает, как можно использовать рекурсию для решения проблемы намного более изящным способом, чем повторяющийся метод.
, С другой стороны, алгоритм рекурсии для ряда Fibonacci и вычисления полномочий числа демонстрирует обратную ситуацию рекурсивного алгоритма, используемого ради рекурсии вместо того, чтобы обеспечить хорошее значение.
Для меня, простой подкачки в Kelly & Pohl Книга А по C для демонстрации вызова по ссылке зеркально отразила меня, когда я увидел его в первый раз. Я посмотрел на это и указатели, сфотографированные в место. Дословно...
void swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
Quicksort в Haskell:
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
, Хотя я couldn'd пишу Haskell в то время, я действительно понимал этот код и с ним рекурсия и quicksort алгоритм. Это просто сделало щелчок, и там это было...
Это - медленное:)
я узнал партии и о C и о компьютерах в целом путем понимания Устройство Вареных пудингов и подкачки XOR
РЕДАКТИРОВАНИЕ:
Jason Z, это - моя подкачка XOR:) прохладный не он.
Для меня это - алгоритм слабой пирамидальной сортировки, потому что это показывает (1) насколько мудрая выбранная структура данных (и алгоритмы, работающие над ним), может влиять на производительность и (2) это, захватывающие вещи могут быть обнаружены даже в старых, известных вещах. (слабая пирамидальная сортировка является лучшим вариантом всех пирамидальных сортировок, который был доказан восемь лет спустя.)
Quicksort: Пока я не добрался до колледжа, я никогда не подвергал сомнению, была ли Пузырьковая сортировка грубой силы самым эффективным способом отсортировать. Это просто казалось интуитивно очевидным. Но быть подвергнутым неочевидным решениям как Quicksort учило меня смотреть мимо очевидных решений видеть, доступно ли что-то лучше.
Я не знаю, квалифицирует ли это как алгоритм, или просто классический взлом. В любом случае это помогло заставить меня начинать думать вне поля.
Подкачка 2 целых числа, не используя промежуточную переменную (в C++)
void InPlaceSwap (int& a, int &b) {
a ^= b;
b ^= a;
a ^= b;
}
Минимакс учил меня, что шахматные программы не умны, они могут просто думать, больше продвигается вперед, чем Вы можете.
По некоторым причинам мне нравится Schwartzian, преобразовывают
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, foo($_)] }
@unsorted;
Где нечто ($) представляет вычисление - интенсивное выражение, которое берет $ (каждый объект списка в свою очередь) и производит соответствующее значение, которое должно быть сравнено в его пользе.
Итеративный алгоритм для Fibonacci, потому что для меня это закрепило то, что самый изящный код (в этом случае, рекурсивная версия) является не обязательно самым эффективным.
Для разработки - "выдумка (10) = выдумка (9) + выдумка (8)" подход означает, что выдумывают (9), будет оценен для выдумывания (8) + выдумка (7). Таким образом, оценка выдумки (8) (и для этого fib7, fib6) будет все оценена дважды.
повторяющийся метод, (воркуют = prev1 + prev2 в forloop) не делает дерева этот путь, и при этом это не берет в качестве большой памяти, так как это - только 3 переходных переменные вместо кадров n в стопке рекурсии.
я склонен бороться за простой, изящный код, когда я программирую, но это - алгоритм, который помог мне понять, что это не end-all-be-all для записи хорошего программного обеспечения, и что в конечном счете конечные пользователи не заботятся, как Ваш код смотрит.
По некоторым причинам Пузырьковая сортировка всегда выделялась мне. Не потому что это изящно или хорошо просто, потому что это / глупое имя, я предполагаю.
синтаксический анализ методом рекурсивного спуска - я не забываю очень впечатляться, как такой простой код мог сделать что-то настолько на вид сложное.
алгоритм визуализации строки Bresenham получил меня заинтересованный графическим рендерингом в реальном времени. Это может использоваться для рендеринга заполненных полигонов, как треугольники, для вещей как 3D образцовый рендеринг.
Кодирование методом Хаффмана было бы моим, я первоначально сделал свою собственную немую версию путем уменьшения числа битов для кодирования текста от 8 вниз к меньше, но не думал о переменном числе битов в зависимости от частоты. Тогда я нашел кодирование методом Хаффмана описанным в статье в журнале, и оно открыло много новых возможностей.
Этот мог бы звучать тривиальным, но это было открытие для меня в то время. Я был в своем самом первом классе (VB6) программирования, и Профессор только что учил нас случайным числам, и он дал следующие инструкции: "Создайте виртуальную лотерейную машину. Предположите, что стеклянный шар, полный 100 шаров пинг-понга, отметил от 0 до 99. Выберите их случайным образом и отобразите их число, пока они не были все выбраны, никакие дубликаты".
Все остальные записали их программу как это: Выберите шар, поместите его число в "уже выбранный список" и затем выберите другой шар. Проверьте, чтобы видеть, если его уже выбранный, раз так выберите другой шар, если не помещенный его число в "уже выбранный список" и т.д.
, Конечно, к концу они делали сотни сравнений для нахождения нескольких шаров, которые не были уже выбраны. Это было похоже на отбрасывание шаров назад в банку после выбора их. Мое откровение должно было выбросить шары после выбора.
я знаю, что это звучит отупляющим образом очевидным, но это было моментом, что "переключатель программирования" был зеркально отражен в моей голове. Это было моментом, что программирование пошло от попытки выучить странный иностранный язык попытке выяснить приятную загадку. И как только я установил ту умственную связь между программированием и забавой, там не была действительно никакая остановка меня.
Quicksort. Это показало мне, что рекурсия может быть мощной и полезной.
Общие алгоритмы:
Числовой связанный:
связанный с теорией чисел:
я также любил изучать квантовые вычисления ( Shor и Deutsch-Josza алгоритмы, например): это учит Вас думать из поля.
, Как Вы видите, я немного склоняюсь к ориентированным на математику алгоритмам:)
Не мой любимый, но Алгоритм Миллера Рабина для проверки простоты показал мне, что быть правым почти всегда достаточно хорошо почти всегда. (т.е. не доверяйте вероятностному алгоритму только потому, что он может ошибаться.)
Карта / уменьшение. Две простые концепции, которые сочетаются друг с другом, чтобы упростить распараллеливание множества задач обработки данных.
Ой ... и это только основа массово-параллельного индексирования:
Больше всего я горжусь решением, когда писал что-то очень похожее на пакет DisplayTag. Это научило меня многому о дизайне кода, ремонтопригодности и повторном использовании. Я написал его задолго до DisplayTag, и он был заключен в соглашение о неразглашении информации, поэтому я не мог открыть его исходный код, но я все еще могу говорить об этом во время собеседований.
У меня нет любимого - есть так много красивых, из которых можно выбрать - но один я всегда Интересной оказалась формула Бейли – Борвейна – Плуфа (BBP) , которая позволяет вычислить произвольную цифру числа Пи без знания предыдущих цифр.
Алгоритм поиска кратчайших путей для всех пар Флойда-Уоршалла
procedure FloydWarshall ()
for k := 1 to n
for i := 1 to n
for j := 1 to n
path[i][j] = min ( path[i][j], path[i][k]+path[k][j] );
Вот почему это круто: когда вы впервые узнаете о задаче поиска кратчайшего пути в курсе теории графов , вы, вероятно, начнете с алгоритма Дейкстры, который решает кратчайший путь от одного источника. Поначалу это довольно сложно, но потом вы преодолеете это и полностью поняли.
Затем учитель говорит: «Теперь мы хотим решить ту же задачу, но для ВСЕХ источников». Вы думаете про себя: «О боже, это будет намного сложнее! Это будет как минимум в N раз сложнее, чем алгоритм Дейкстры !!! ».
Затем учитель дает вам Флойд-Уоршолла. И твой разум взрывается. Потом начинаешь плакать от того, насколько красиво простой алгоритм. Это просто тройной вложенный цикл. Он использует только простой массив для своей структуры данных.
Наиболее открывающим мне глаза является следующее осознание: допустим, у вас есть решение проблемы A. Тогда у вас есть более крупная «суперпроблема» B, которая содержит проблему A. Решение проблемы B может быть проще, чем решение проблемы A.
RSA познакомил меня с миром модульной арифметики, которую можно использовать для решения неожиданного числа из ] интересные задачи !