Доброго времени суток! Пытаюсь выполнить упражнение по учебнику касательно факториала. Автором приведен рекурсивный метод вычисления. В задании он просит выполнить вычисления нерекурсивно. Не получается, потому что я не понимаю алгоритма. В инете почитал. Все равно не понял. Пример автора: Код (Text): TITLE Программа вычисления факториала (Fact.asm) INCLUDE Irvine32.inc .code main PROC call ClrScr push 12 ; Вычислим 12! call Factorial ; Результат в EAX ReturnMain: call WriteDec call CrLf call DumpRegs exit main ENDP Factorial PROC ; [EBP+8] = n - исходное число, факториал которого считаем push ebp mov ebp,esp mov eax,[ebp+8] ; Загрузим число N cmp eax,0 ; n > 0? ja L1 ; Да, продолжим вычисление mov eax,1 ; Нет, вернем 1 jmp L2 L1: dec eax push eax ; Вычислим (n-1)! call Factorial ; Команды в этом месте, выполняются после возврата из рекурсии ReturnFact: mov ebx,[ebp+8] ; Загрузим N mul ebx ; edx:eax = eax * ebx(N) L2: pop ebp ret 4 Factorial ENDP END main Мой пример: Код (Text): Factorial PROC mov ecx,buf .IF ECX <= 1 jmp L2 .ELSE L1: mov ebx,ecx ; ECX = N dec ebx ; EBX = (N - 1) mov eax,ecx mul ebx add total,eax Loop L1 .ENDIF mov eax,total jmp Quit L2: mov eax,1 Quit: ret Factorial ENDP выводит ошибочное значение. Как считать? Прошу объяснить на пальцах, кому не сложно. Спасибо.
На это вопрос ответил еще создатель паскаля - нет никаких преимуществ рекурсии по сравнению с циклом ответ простой - в цикле накапливаешь произведение очень упрощенно в 16 разрядном коде Код (Text): mov ax,1 mov cx,n $loop: mul cx loop $loop на выходе получишь значение факториала значение n естественно должно быть в разумных пределах так чтоб факториал в слово влез
Rockphorr, Спасибо! Все работает. Значит алгос я правильно понял и моя ошибка в другом месте программы. Спасибо!