簡體   English   中英

在遞歸函數中命名變量

[英]Naming variables in recursive functions

我的遞歸函數接收變量$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。

您可以毫無問題地使用Example1。

變量$b在函數的范圍內,因此在函數內的任何位置都可用。

由於您再次調用函數,因此您可以考慮從該函數創建一個新實例(即使從技術上來說, instance也不是描述它的正確詞,但為了解釋起見,它是可行的)。 此實例不知道他收到的$b與前面的實例相同且命名相同。

同樣因為您沒有通過引用粘貼它們,所以在一個函數調用中對$b所做的任何更改都不會在其他調用中進行任何更改,而是在您從更改了$b的函數進行調用的調用中進行任何更改。 因此,這意味着如果您將每個引用中的它們都賦予$a ,那么最后將對其進行更改。

不,您不必使用其他名稱傳遞變量。 變量$b僅存在於函數內部。 因此,如果您再次調用該函數

看一下變量范圍: PHP手冊

在函數內部,您可以在作用域內重用變量名,作用域是函數的開始-結束。 如果您遞歸調用函數,則內部作用域不會影響外部作用域。

考慮功能:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM