为什么这个递归函数会像这样工作?

时间:2014-09-25 13:25:08

标签: php algorithm recursion computer-science

我正在尝试学习递归并编写了一个函数,它接受一个数字并将其计数到零,然后再将其计数到原始数字,该函数有效,但我不明白的是为什么它的工作原理。我解释了为什么在else语句后打印的第一个打印:" 5 4 3 2 1"然后数字为0,if语句打印:" 0"。在这种情况之后,我不明白,因为现在该函数在else语句之后进入第二次打印并打印:" 1 2 3 4 5"这对我来说很奇怪。如果有人能向我解释,我真的很感激。

<?php
function rec_downandup($num){
    if($num == 0){
        print '0 ';
    }else{
        print $num.' ';
        rec_downandup($num-1);
        print $num.' ';
    }
}
rec_downandup(5);
?>

输出

5 4 3 2 1 0 1 2 3 4 5

3 个答案:

答案 0 :(得分:8)

当你仔细观察时,它应该变得清晰。

print $num.' ';
rec_downandup($num-1);
print $num.' ';

首次输入时,您将获得

print 5.' ';
rec_downandup(4);
print 5.' ';

之后,这是

print 5.' ';
print 4.' ';
rec_downandup(3);
print 4.' ';
print 5.' ';

因此看起来功能倒计时和倒计时,但实际上它只是倒计时并将每个数字放置两次 - 第二次按相反的顺序排列,因此它似乎正在计数。

答案 1 :(得分:0)

@kingero提供的答案很有用,它解释了究竟发生了什么。如果你想直接倒计时,你会这样做 -

function rec_downandup($num){
    if($num == 0){
        print '0 ';
    }else{
        echo $num;
        $num = rec_downandup($num-1); // you can do this without the variable assignment, it just seems neater this way.
    }
}
rec_downandup(5);

答案 2 :(得分:0)

每次调用re_downandup()函数时,参数$num都会获取传递给函数的值,它将保持该值,直到函数在其最后一个右括号中结束。

同样重要的是,在存在对函数的递归调用时,执行流程在此调用中继续,这就是为什么第二个print不会发生直到执行从所述递归返回呼叫。

让我们来看看:

print $num.' ';
rec_downandup($num-1);
print $num.' ';

第一个print $num将打印数字,然后执行流程将在对函数的新调用中继续,这将显示变量的值减1。这将继续以递归方式发生,直到$num达到零。

当给出递归中断条件$num == 0时,该函数将被允许&#34;继续直到结束;所以每次递归调用都会返回,也就是第二个print $num将开始执行,因为当程序的执行流程从rec_downandup()返回时会发生这种情况。

在这种情况下打印的值将是$num变量在触发递归调用时具有的值。