ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
161942 Топик полностью
ReAl (22.07.2009 18:12, просмотров: 183) ответил bialix2 на я забыл как этот термин будет по русски -- что-то типа разворачивание хвоста рекурсии. компилятор Хаскелла способен сам заметить такие случаи и развернуть рекурсию в цикл. ленивые вычисления -- это когда вычисление результата откладывается до того
В более простом варианте и gcc хвостовую рекурсию замечает и превращает в цикл, а в этом не хочет - толи плюсы потянули лишнее и замазали картину, толи ещё что. int fact(int i) { if(i == 1) return 1; else return i * fact(i-1); }
gcc -O2 -S -fomit-frame-pointer foo.c
.file "foo.c" .text .p2align 4,,15 .globl fact .type fact, @function fact: movl 4(%esp), %edx movl $1, %eax cmpl $1, %edx jne .L4 jmp .L3 .p2align 4,,7 .p2align 3 .L7: movl %ecx, %edx .L4: leal -1(%edx), %ecx imull %edx, %eax cmpl $1, %ecx jne .L7 .L3: rep ret