Фибоначчи с шагами рекурсии, показанными с отступом / вложенными
Это формат, который мне нужен:
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.