我很难递归上班。好吧,递归n!阶乘计算器并不难,花了我大约半天的时间来解决。
mov eax, [input]
call factorialator
jmp quit
;
factorialator:
cmp eax, 0
je return
push eax
dec eax
call factorialator
;
pop eax
imul ebx, eax
ret
;
return:
mov ebx, 1
ret
现在,该函数以n = n-1进行调用,并每次将n推入n = 0(将它们全部相乘)。 轻松自在
但是现在,我不得不用(n-1)和(n-2)调用该函数,我无法想象它将如何工作,因为我必须管理返回地址,堆栈和值。我所知道的是,每当它减去1或2且结果为1时,它都应该包含一个计数器,该计数器将为我们提供结果。
以n-1返回,直到n-1 = 1,在这种情况下,返回n-2,然后再返回n-1。我只是如此感到困惑,并且一直为此努力了两天。
感谢您的帮助,谢谢!
答案 0 :(得分:0)
这是相同的原理。在阶乘情况下,您暂时保存N
是因为以后需要用它乘以fact(N-1)
。
在斐波那契数列情况下,您还保存了N
(或N-1
),因为您稍后需要它来计算N-2
,以便可以计算fib(N-2)
。
x86实现可能看起来像这样:
fib:
cmp eax,1 ; Base case?
jbe done ; Yes => return n
dec eax
push eax ; Save n-1 on the stack
call fib ; Calculate fib(n-1)
xchg eax,[esp] ; Place fib(n-1) on the stack, while retrieving n-1 into eax
dec eax
call fib ; Calculate fib(n-2)
add eax,[esp] ; fib(n-2) + fib(n-1)
add esp,4 ; "Undo" the push operation
done:
ret