Фибоначчи с шагами рекурсии, показанными с отступом / вложенными - PullRequest
0 голосов
/ 22 декабря 2018

Мне нужен этот формат:

F(3) = F(2) + F(1) =
  F(2) = (F1) + F(0) =
    F(1) = 1
    F(0) = 1   
  F(2) = 1   
  F(1) = 1 
F(3) = 2

и это мой код, как мне поступить, чтобы получить нужный мне формат?Пожалуйста, дайте мне подсказку или что-то, что может помочь, спасибо.Я только начинаю изучать ассемблер.Я только знаю, как показать первую строку, например, f () = ответ, но не знаю, как показать процесс.

    .data
    fib1 BYTE "f(",0
    fib2 BYTE ") + f(",0
    fib3 BYTE ") = ",0
    intVal DWORD ?

    main PROC

    mov edx, OFFSET fib1    ;show f(intVal)=
    call WriteString
    mov edx, intVal
    call WriteDec
    mov edx, OFFSET fib3
    call WriteString

    mov ecx, intVal-1       
    push intVal
    call fib
    add esp, 4



    call WriteDec           ;show result
    call crlf

    mov edx, OFFSET msg5        ;show goodbye msg
    call WriteString
    mov edx, OFFSET username
    call WriteString    
    exit 
    main ENDP



       fib PROC c
    add ecx, 1
    push ebp
    mov ebp, esp
    sub esp,4               
    mov eax, [ebp+8]        ;get value

    cmp eax,2               ;if ((n=1)or(n=2))
    je S4
    cmp eax,1
    je S4

    dec eax                 ;do fib(n-1)+fib(n-2)
    push eax                ;fib(n-1)
    call fib
    mov [ebp-4], eax        ;store first result

    dec dword ptr [esp]     ;(n-1) -> (n-2)
    call fib
    add esp,4           ;clear

    add eax,[ebp-4]     ;add result and stored first result

    jmp Quit
S4:
    mov eax,1           ;start from 1,1

Quit: 
    mov esp,ebp         ;restore esp
            pop ebp             ;restore ebp

            ret
        fib ENDP

        END main

1 Ответ

0 голосов
/ 23 декабря 2018

Код должен выводить «новую строку» в конце каждой строки вывода, что может быть возврат каретки (00dh) с последующим переводом строки (00ah) или просто перевод строки (00ah) в зависимости от системы (Iне знаю настройки irvine).

Строки с отступом должны быть напечатаны из функции fib, что означает, что вы должны сохранять (стек push / pop) любые регистры, которые используют функции печати. ​​

Функция fib должна распечатывать переменное количество пробелов в зависимости от уровня рекурсии на основе текста, 2 пробела на уровень рекурсии.

Функция fib должна обрабатывать ввод 0и вернуть 0.

Обратите внимание, что число рекурсивных вызовов функции fib будет 2 * fib (n) - 1, при условии, что fib проверяет наличие fib (0), fib (1), fib (2)(больше, если он не проверяет fib (2)), что составляет 5,94 миллиарда вызовов для fib (47) = 2971215073, максимальное значение для 32-битных целых чисел без знака.Возможно, вы захотите ограничить входные данные чем-то вроде fib (10) = 55 или fib (11) = 89 или fib (12) = 144.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...