Настоящая хвостовая рекурсия(такая, как в функциональном программировании) в C/C++ не возможна. Все вызовы вашей функции будут ложиться в стек. Вроде-бы из всех компиляторов один GCC научили оптимизировать выполнение рекурсивной функции. В результате которого подменяются только значения параметров рекурсивной функции, а множественного вызова не происходит. По сути дела компилятор разворачивает вашу хвостовую рекурсию в банальный цикл. Так почему бы вам не делать это ручками, как вышеупомянутые корейцы? Но это не более, чему надувательство со стороны GCC. Нет никакой гарантии, что ваш код будут собирать именно гнутым компилятором. А значит код, быстро работающий у вас, может тормозить(а то и вызывать переполнение стека(кто-ж знает, сколько раз будет сделан вызов вашей функции, так можно и переполнение стека организовать)) у других. Согласитесь, будет некрасиво, если ваша программа начнёт вылетать из-за такой мелочи. Кстати оптимизацию хвостовой рекурсии у GCC можно включать/отключать указывая нужный флаг оптимизации. Кто-то запретит его случайно, собирая в пакетик ваш проект, и всё - вам начнут поступать гневные упреки в багзиллу:) Да, я не программист вообще. Тем более не программист на C, с которым я никогда не имел дела. Да, я прочитал пару книжек по питону, полторы по PHP, и одну по C++. Иногда пишу небольшие программы для себя, автоматизирую рутинные операции. И тем не менее я знаю о том, что говорю. Может былая страсть к MASM/FASM и ковырянию чужого ПО в OllyDbg сказывается?
|