首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个递归阶乘程序只返回我想要计算的数字?

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

Stack Overflow用户
提问于 2020-09-09 23:42:39
回答 1查看 242关注 0票数 0

我用ARM32编写了这个简单的(非工作的)程序:

代码语言:javascript
复制
.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。

代码语言:javascript
复制
$ ./a.out
$ echo $?
5        

为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 00:01:51

代码语言:javascript
复制
.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

遍历您的代码...

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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只是为了保持堆栈对齐,所以记住,因为你可以用它来保存这些寄存器中的一个并在退出时恢复它。

请注意,来自gradeschool的

代码语言:javascript
复制
4*3*2*1 = 1*2*3*4

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

首先用C(或者你比较擅长的语言)编写和调试它,然后用printfs乱写代码,一旦你有了你知道的语言的算法,然后简单地用汇编语言或你正在学习的任何新语言重写它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63815099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档