我的递归函数接收变量$a
作为参数,记忆作为$b
,然后传递它本身。
如果我递归调用一个函数,我传递给递归调用的变量(函数的第4行)是否与记忆变量(函数的第1行)具有相同的名称?
示例1
$a = "bob";
function do_someting($b)
{
echo $b;
if ($b == 'bob') {
do_something($b);
}
}
do_something($a);
或者我必须传递一个名称不同的变量(此函数的第4行和第5行)?
示例2
function do_someting($b)
{
echo $b;
if ($b == 'bob') {
$c = $b;
do_something($c);
}
}
这里给出的函数将导致无限循环。这不是我真正的代码,只是举例说明我的问题。 不要运行它。
答案 0 :(得分:2)
示例1运行正常。当你传递$ b时,接收函数只收到$ b的副本,因此当接收函数修改它时,它不会影响原来的$ b。
答案 1 :(得分:0)
您可以毫无问题地使用Example1。
变量$b
在您的函数范围内,因此它在函数中的任何位置都可用。
由于你再次调用你的函数,你可以想到一个新的实例(即使在技术上instance
也不是正确的词来描述它我猜,但是为了解释它的工作原理)是创建的从那个功能。这个实例并不知道他收到的$b
是相同的,并且命名与之前的实例相同。
另外,因为你没有通过引用粘贴它们,在一个函数调用中对$b
的任何更改都不会改变其他调用中的任何内容,但是在将从函数调用的调用中您在哪里更改了$b
。那么这意味着如果你在每个参考文献中给出它们$a
将在最后改变。
答案 2 :(得分:0)
不,您不必使用其他名称传递变量。
变量$b
“生活在函数内部。所以如果再次调用该函数
答案 3 :(得分:0)
查看变量范围:PHP manual
在函数内部,您可以在范围内重用变量名称,范围是函数的起始端。如果以递归方式调用函数,则内部范围不会影响外部范围。
考虑功能:
function decrements($b) {
print "pre call $b={$b}\n\r";
if($b>0) decrements(--$b);
print "post call $b={$b}\n\r";
}
decrements(4);
输出将是:
pre call 4=4
pre call 3=3
pre call 2=2
pre call 1=1
pre call 0=0
post call 0=0
post call 0=0
post call 1=1
post call 2=2
post call 3=3
如果您插入$ b = 4
decrements($b) { //$b = 4
decrements($b) { //$b = 3
decrements($b) { //$b = 2
decrements($b) { //$b = 1
decrements($b) { //$b = 0
} //$b = 0
} //$b = 0
} //$b = 1
} //$b = 2
} //$b = 3