2016-01-04 77 views
0

我被一個僱主給出了一個測驗來確定我作爲一個程序員的能力,測試或多或少「寫一個函數來計算這個鏈表的長度」。我沒有通過測驗,因爲無論什麼原因,我的功能都沒有返回任何東西(這是一個定時測驗)。這是我的代碼。遞歸函數和鏈表PHP

class IntList{ 
var $value = 1; 
var $next = null; 
} 

$A = new IntList(); 
$B = new IntList(); 
$C = new IntList(); 
$D = new IntList(); 

$A->next = $B; 
$B->next = $C; 
$C->next = $D; 


main($A); 

$count = 0; 

function main($L) 
{ 
    global $count; 

    $final = getListLength($L, $count); 

    print $final; 
} 


function getListLength($L, $count) 
{ 


    if (isset($L->next)) 
    { 
     $count++; 
     getListLength($L->next, $count); 
    } else 
    { 
     print $count; 
     return $count; 
    } 

} 

in getListLength即時得到3當我打印計數之前,返回語句。但是在函數返回後,我沒有輸出。我現在感覺真的很愚蠢。有什麼想法嗎?

+0

你叫'getListLength'並通過'$ count'作爲參數,但你永遠不使用它的遞歸調用中返回值('getListLength($ L->接下來,$數);') 。這是第一個錯誤,第二個錯誤是,如果你點擊'else'語句,你什麼也不會返回... –

+2

哪部分是你的代碼,哪部分是測驗代碼? –

+1

@MarkusSafar如果他沒有擊中其他的命中遞歸,所以沒關係他沒有在第一個塊中返回任何東西。 –

回答

0

你只是忘了把global $count;放在第二個函數中。

此外,如果您想計算最後一個,則應該將$count++移到條件之外。

Here's a fiddle.

或者,您也可以因爲你正試圖在這裏使用遞歸引用

function getListLength($L, &$count){...} 

Another fiddle..

0

傳遞$ count變量,我認爲這是唯一缺少的是你的遞歸情況沒有返回。你真的不應該需要全球。如果你需要從零開始,你可以給你的getListLength一個默認的計數,或者在main中用零顯式調用它。

function main($L) { 
    $final = getListLength($L); 
    print $final; 
} 

function getListLength($L, $count = 0) { 
    if (isset($L->next)) { 
     $count++; 
     // this case should return 
     return getListLength($L->next, $count); 
    } else { 
     return $count; 
    } 
} 
1

假設這是從測驗代碼(哎呀,PHP4 - '):

class IntList{ 
    var $value = 1; 
    var $next = null; 
} 

$A = new IntList(); 
$B = new IntList(); 
$C = new IntList(); 
$D = new IntList(); 

$A->next = $B; 
$B->next = $C; 
$C->next = $D; 

我不認爲你需要遞歸來解決。你只可以:

function getListLength($list) { 
    $count = 0; 
    $item = $list; 

    while($item instanceof IntList) { 
     $count++; 
     $item = $item->next; 
    } 

    return $count; 
}