我正在尝试学习递归并编写了一个函数,它接受一个数字并将其计数到零,然后再将其计数到原始数字,该函数有效,但我不明白的是为什么它的工作原理。我解释了为什么在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
答案 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
变量在触发递归调用时具有的值。