斐波那契数列的递归算法,有点异常,不知道原因。哪位高手帮小弟我看看
斐波那契数列的递归算法,有点错误,不知道原因。谁帮我看看TITLE Save an array and dispalyINCLUDE Irvine3
斐波那契数列的递归算法,有点错误,不知道原因。谁帮我看看
TITLE Save an array and dispaly
INCLUDE Irvine32.inc
.data
array DWORD 12 DUP (?) ; define a array for saving Fibonacci numbers
step = type array
num DWORD ?
count DWORD ?
prompt byte "The first fibonacci numbers are ",0
prompt1 DWORD " ",0
.code
main PROC
mov eax,0
mov esi,offset array
call readint
mov ecx,eax
mov edx,ecx
mov ebx,0
mov [esi],ebx
mov eax,[esi]
call writeint
mov ebx,1
mov [esi + step],ebx
mov eax,[esi + step ]
call writeint
mov eax,0
mov num,ecx
mov count,2
push [esi]
push [esi + step]
call Fibonacci
mov ecx,edx
L2:
pop ebx
mov eax,ebx
call writeint
add esp,4
loop L2
call crlf
call waitmsg
exit
main ENDP
Fibonacci proc
cmp ecx,count
jl L1
mov eax,0
add eax,[esi]
add esi,step
add eax,[esi]
add esi,step
mov [esi],eax
push [esi]
sub esi,step
inc count
call Fibonacci ;for recursion
L1:
ret
loop L1
Fibonacci endp
END main
我这程序是输入一个位数,然后通过调用函数实现递归,最后输出这个位数的斐波那契数列。我的思想是定义好数列的前两项,并且把它推进栈,然后通过递归调用本身,每次循环计算出一个数列中的数,并把它推进栈,当达到这个位数的时候跳出,并且输出。输出的话,通过调用pop出栈,每次出一个数,存储在ebx中,然后通过eax输出,ESP寄存器移位。这是我的程序的基本思想和流程,但是还是有错误,求大神教导
(push操作和pop操作不知道有没有理解错,push:是将数据压到一个临时存储器就是栈,pop:是将栈中的数据挨个拿出来。但是要符合先进后出原则。) 递归算法 斐波那契
[解决办法]
一看就不对
对于
push [esi] //对于这个压栈,却没有对应的出栈操作,如何维持函数调用的栈平衡呀!!
sub esi,step
inc count
call Fibonacci ;for recursion
[解决办法]
数组循环压栈,它们就在堆栈里顺序排着;取出它们,用 pop 指令出栈啊,要注意的是顺序关系,最先 pop 得到的是最后 push 压入的数据。