斐波那契带有缩进/嵌套的递归步骤

时间:2018-12-22 14:51:04

标签: recursion assembly x86 fibonacci irvine32

这是我需要的格式:

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 :(得分:0)

代码需要在每行输出的末尾输出一个“换行符”,根据系统的不同,它可以是回车符(00dh),后跟换行符(00ah)或换行符(00ah)不知道irvine的设置。

缩进的行应从fib函数中打印,这意味着您必须保存(推入/弹出堆栈)打印函数使用的所有寄存器。

fib函数需要根据文本的递归级别打印出可变数量的空格,基于文本,每个递归级别需要2个空格。

fib函数需要处理输入0并返回0。

请注意,假设fib检查fib(0),fib(1),fib(2),则递归调用fib函数的次数将为2 * fib(n)-1(如果不是,则更多)检查fib(2)),这将是59.4亿次调用fib(47)= 2971215073,这是32位无符号整数的最大值。您可能希望将输入限制为fib(10)= 55或fib(11)= 89或fib(12)= 144。