【发布时间】:2014-04-13 04:44:27
【问题描述】:
在给定序列顺序的情况下,我对这段代码如何为每个 n-1 乘以 n 感到困惑。让我解释一下我如何看待正在发生的事情,你可以指出我错在哪里。
如果 n 小于 0,则比较结果为假,程序仅返回 1(如果这是第一次调用)。如果不是,则调用 L1 并递减。这是我感到困惑的地方。看起来事实在减量后立即再次被调用,并且乘法函数永远不会发生。在这种情况下,如果 n = 5,那么它会简单地递减直到 n = 0,最后乘以 1 x 5。
我最好的猜测是,我在将值推入和弹出堆栈方面遗漏了一些东西,但我不知道。
fact: addi $sp, $sp, -8 # adjust stack for 2 items
sw $ra, 4($sp) # save the return address
sw $a0, 0($sp) # save the argument n
slti $t0, $a0, 1 # test for n < 1
beq $t0, $zero, L1 # if n >= 1, go to L1
addi $v0, $zero, 1 # return 1
addi $sp, $sp, 8 # pop 2 items off stack
jr $ra # return to instruction after jal
L1: addi $a0, $a0, -1 # n >= 1; argument gets (n – 1)
jal fact # call fact with (n – 1)
lw $a0, 0($sp) # return from jal: restore argument n
lw $ra, 4($sp) # restore the return address
addi $sp, $sp, 8 # adjust stack pointer to pop 2 items
mul $v0, $a0, $v0 # return n * fact (n – 1)
jr $ra # return to the caller
编辑:
这里是用 C 语言编写的函数:
int fact (int n)
{
if (n < 1) return (1);
else return (n * fact(n – 1));
}
【问题讨论】:
-
条件可以是
if (n <= 1)以避免一次(无用的)递归。