为什么这个递归阶乘程序只返回我想要计算的数字



我在ARM32:中做了这个简单的(非工作(程序

.global main
main:
mov r0,#5    // 5 is the number that I want to calculate the factorial
mov r1,r0
factorial:
cmp r1,#1
beq end
sub r1,r1,#1    // n-1
push {ip,lr}    // save the lr
bl factorial
mul r0,r1,r0    // multiply r0 * n-1
pop {ip,lr}
end:
bx  lr

如果我执行它,我得到5,而不是120。

$ ./a.out
$ echo $?
5        

为什么?

.global main
main:
mov r0,#5    // 5 is the number that I want to calculate the factorial
mov r1,r0
factorial:
cmp r1,#1
beq end
sub r1,r1,#1    // n-1
push {ip,lr}    // save the lr
bl factorial
mul r0,r1,r0    // multiply r0 * n-1
pop {ip,lr}
end:
bx  lr

浏览您的代码。。。

mov r0,#5  r0 = 5
mov r1,r0  r1 = 5
cmp r1,#1
beq end 
sub r1,r1,#1  r1 = 4
push
bl factorial
cmp r1,#1
beq end
sub r1,r1,#1 r1 = 3

你看到问题了吗?你现在应该已经看到了。

and this continues a few more times until
sub r1,r1,#1 r1 = 1
push
bl factorial
cmp r1,#1
beq end
bx lr
mul r0,r1,r0   r0 = 1 * 5 = 5
pop
bx lr
cmp r1,#1
beq end
bx lr
mul r0,r1,r0   r0 = 1 * 5 = 5
...

先尝试不使用递归,记住对于递归,在这种情况下,每次调用都需要一个局部变量,并且如果要使用单个值或两个值,则需要考虑将比较放在哪里,推送中的ip只是为了保持堆栈对齐,所以请记住,因为您可以使用它来保存其中一个寄存器,并在退出时恢复它。

注意,从年级

4*3*2*1 = 1*2*3*4

在stackoverflow提问之前,你需要付出一些努力。

首先用C语言(或你更擅长的语言(编写和调试它,用printfs填充代码,一旦你用你熟悉的语言编写了算法,就用汇编语言或你正在学习的任何新语言重写它。

最新更新