Факториал. Не пойму этап вычисления.

Тема в разделе "WASM.BEGINNERS", создана пользователем hack_virii, 9 окт 2009.

  1. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Доброго времени суток!

    Пытаюсь выполнить упражнение по учебнику касательно факториала.
    Автором приведен рекурсивный метод вычисления.
    В задании он просит выполнить вычисления нерекурсивно.
    Не получается, потому что я не понимаю алгоритма. В инете почитал. Все равно не понял.
    Пример автора:
    Код (Text):
    1. TITLE   Программа вычисления факториала    (Fact.asm)
    2.  
    3. INCLUDE Irvine32.inc
    4.  
    5. .code
    6. main PROC
    7. call ClrScr
    8. push 12             ; Вычислим 12!
    9. call Factorial      ; Результат в EAX
    10. ReturnMain:
    11. call WriteDec
    12. call CrLf
    13. call DumpRegs
    14.  
    15. exit
    16. main ENDP
    17.  
    18.  
    19. Factorial PROC
    20. ; [EBP+8] = n - исходное число, факториал которого считаем
    21. push ebp
    22. mov ebp,esp
    23. mov eax,[ebp+8]     ; Загрузим число N
    24. cmp eax,0           ; n > 0?
    25. ja L1               ; Да, продолжим вычисление
    26. mov eax,1           ; Нет, вернем 1
    27. jmp L2
    28. L1:
    29. dec eax
    30. push eax            ; Вычислим (n-1)!
    31. call Factorial
    32. ; Команды в этом месте, выполняются после возврата из рекурсии
    33. ReturnFact:
    34. mov ebx,[ebp+8]     ; Загрузим N
    35. mul ebx             ; edx:eax = eax * ebx(N)
    36. L2:
    37. pop ebp
    38. ret 4
    39. Factorial ENDP
    40.  
    41. END main
    Мой пример:
    Код (Text):
    1. Factorial PROC
    2. mov ecx,buf
    3. .IF ECX <= 1
    4. jmp L2
    5. .ELSE
    6. L1:
    7. mov ebx,ecx             ; ECX = N
    8. dec ebx                 ; EBX = (N - 1)
    9. mov eax,ecx
    10. mul ebx
    11. add total,eax
    12. Loop L1
    13. .ENDIF
    14. mov eax,total
    15. jmp Quit
    16. L2:
    17. mov eax,1
    18. Quit:
    19. ret
    20. Factorial ENDP
    выводит ошибочное значение. Как считать? Прошу объяснить на пальцах, кому не сложно.
    Спасибо.
     
  2. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    http://ru.wikibooks.org/wiki/Примеры_реализации_функции_факториал
     
  3. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
  4. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    я ошибся, или у тебя вместо "6*5*4*3*2*1" получается "6*5+4*3+2*1"?
     
  5. jakimushka

    jakimushka New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    43
    ошибся.
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    На это вопрос ответил еще создатель паскаля - нет никаких преимуществ рекурсии по сравнению с циклом

    ответ простой - в цикле накапливаешь произведение
    очень упрощенно в 16 разрядном коде
    Код (Text):
    1.  mov ax,1
    2.  mov cx,n
    3. $loop:
    4.  mul cx
    5.  loop $loop
    на выходе получишь значение факториала
    значение n естественно должно быть в разумных пределах так чтоб факториал в слово влез
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    значение в AX
     
  8. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Rockphorr, Спасибо! Все работает. Значит алгос я правильно понял и моя ошибка в другом месте программы.
    Спасибо!