Это должно сработать, хотя может потребоваться, чтобы родительский элемент elem
был относительно позиционирован ...
var elem = $("#elementToShowCalenderUnder");
var pos = elem.position();
$("#yourCalender").css({
position: "absolute",
left: pos.left() + "px";
top: pos.top() + elem.height() + 5 + "px";
}).insertAfter(elem);
Если вы не используете рекурсию, вы все равно будете переписывать свой алгоритм, используя свой собственный «стек», который в конечном итоге будет подвергаться аналогичным условиям во время выполнения.
Вы можете настроить размер стека в соответствии с потребностями вашего алгоритма, но если вы посмотрите на WPF / Silverlight и обычные алгоритмы, связанные с пользовательским интерфейсом, все они рекурсивны по своей природе, и каждый щелчок, каждое нажатие клавиши и каждое уведомление проходят через множество рекурсивных методы.
Ознакомьтесь с Создание потока с нестандартным размером стека ,
Хотя скорость может варьироваться в зависимости от алгоритма и сложности, но создание отдельного нерекурсивного алгоритма усложнит задачу, как вы будете выполняйте все операции с хранилищами данных самостоятельно, используя списки, стеки и т. д.
Это довольно сложный вопрос по сравнению с производительностью, если вы хотите повысить производительность, то ваш нерекурсивный алгоритм будет выполняться быстрее, но для разработки и реализации такого алгоритма потребуется больше времени. Где еще, если вам нужно более быстрое решение, вы можете написать рекурсивный алгоритм, который будет медленнее в исполнении, но если разница составляет всего несколько миллисекунд или микросекунд, то делать это не стоит.
Цикл всегда превосходит рекурсию, поскольку у стека всегда больше издержек, чем у вас. Многие операции с потоками сильно бьют по стеку, так что вы получаете дальнейшее снижение.
Тем не менее, удобочитаемость является большим плюсом, поэтому я лично буду использовать рекурсию, если мне не понадобится каждая капля производительности, например в операциях обработки изображений, или я не ожидаю, что мои стеки вырастут очень большими - хотя переполнение стека почти исключительно из-за ошибок.
Когда вам нужна рекурсия, она вам нужна, например, для прогулки по дереву в глубину или для анализа рекурсивного спуска.
Если у вас есть выбор, например, использовать рекурсию вместо цикла, то, возможно, это зависит от того, на каком языке вы находитесь. Будьте проще.
В текущей реализации Microsoft компилятора C # оптимизация хвостовых вызовов не производится. Это создает функциональные алгоритмы, которые сильно переполняют стек. Хотя я не рекомендовал бы использовать глубоко рекурсивные алгоритмы в C #, методы, которые не повторяются глубоко, не должны вызывать у вас никаких проблем.