递归函数中的命名变量



我的递归函数接收变量$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);
    }
}

这里给出的函数将导致一个无限循环。这不是我真正的代码,只是一个例子来说明我的问题不要运行它。

示例1运行良好。当您传递$b时,接收函数只接收$b的副本,因此当接收函数修改它时,它不会影响原始的$b。

看看变量范围:PHP手动

在函数内部,您可以在作用域内重用变量名,作用域是函数的起始端。若递归调用函数,那个么内部作用域不会影响外部作用域。

考虑功能:

function decrements($b) {
   print "pre call $b={$b}nr";
   if($b>0) decrements(--$b);
   print "post call $b={$b}nr";
}
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

您可以毫无问题地使用Example1。

变量$b在您的函数范围内,因此它在函数中的任何位置都可用。

由于您再次调用函数,您可以考虑从该函数创建一个新实例(我想,即使从技术上讲instance也不是描述它的合适词,但为了解释它是有效的)。这个实例不知道他收到的$b与之前的实例相同,名称也相同。

另外,因为您没有通过引用粘贴它们,所以在一个函数调用中对$b的任何更改都不会改变其他调用中的任何内容,而是在将从更改$b的函数调用的调用中。因此,这意味着,如果你在每个引用中给出它们,$a将在最后更改。

不,您不必传递具有不同名称的变量。变量$b就在函数内部"存在"。因此,如果您再次调用函数

最新更新