递归函数和链表PHP

时间:2016-01-04 21:32:21

标签: 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;
    }

}
getListLength中的

当我在return语句之前打印计数时,我得到3。但是在函数返回后我没有输出。我现在觉得很蠢。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

假设这是测验中的代码(argh,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;
}

答案 1 :(得分:0)

你忘了把$count++放在第二个函数中。

另外,如果你想计算最后一个,你应该将function getListLength($L, &$count){...} 移到条件之外。

$observe

或者,您可以通过引用传递$ count变量

var userChoice;
while (!~["rock", "paper", "scissors", "rope"].indexOf(userChoice)) {
    userChoice = prompt("Sorry invalid input, please enter either: rock, paper,scissors, or rope.");
}

AngularJS $compile Directive Attributes API Reference

答案 2 :(得分:0)

由于你试图在这里使用递归,我认为唯一缺少的是你的递归情况没有返回。你真的不应该需要全球化。如果您需要从零开始,则可以为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;
    }
}