Фибоначчи с шагами рекурсии, показанными с отступом / вложенными

Это формат, который мне нужен:

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 ответ

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

Строки с отступом должны быть напечатаны из функции 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.

Другие вопросы по тегам