PHP рекурсивная функция возврата (true) не работает

0

Учитывая группы пар на каждом уровне структуры ниже, я хочу найти, есть ли "петля" для соединения точек. (если "b" на уровне 0 имеет совпадение "a" на следующем уровне).

Я использую рекурсивную функцию для тестирования, и она работает нормально. Но когда я проверяю возвращаемое значение, это терпит неудачу:

Код:

        $tracker=array();
        array_push($tracker, 0);

        if (findloop(1, $candidates[0]['pairs'][0]['b'])){
            echo "<h1>a path has been found</h1><pre>";
                print_r($tracker);
            echo "</pre>";
        }else{
            echo "<h3>no loop found</h3><pre>";
                print_r($tracker);
            echo "</pre>";
        }

Функция:

function findloop($level, $value){  // so far.. only progression...
    echo "<p>level $level, $value</p>";
    global $candidates;
    global $tracker;
    foreach($candidates[$level]['pairs'] as $key=>$pair){
        if($pair['a']==$value){
            array_push($tracker, $key);
            if($level==sizeof($candidates)-1){ 
                echo "omgggggg";
                return true; 
            }else{
                findloop($level+1, $pair['b']);
            }
        }
    }

}

Результат:

level 1, 19
level 2, 15
level 3, 18
omgggggg
no loop found    < - - - - - - - function does (?) return true but it fails

Array
(
    [0] => 0
    [1] => 1
    [2] => 0
    [3] => 1
)

Структура:

Array
(
    [0] => Array
        (
            [angle] => 41.7
            [pairs] => Array
                (
                    [0] => Array
                        (
                            [a] => 6
                            [b] => 19
                        )
                    [1] => Array
                        (
                            [a] => 19
                            [b] => 6
                        )
                )
        )
    [1] => Array
        (
            [angle] => 11.8
            [pairs] => Array
                (
                    [0] => Array
                        (
                            [a] => 15
                            [b] => 19
                        )
                    [1] => Array
                        (
                            [a] => 19
                            [b] => 15
                        )
                )
        )
    [2] => Array
        (
            [angle] => 14.3
            [pairs] => Array
                (
                    [0] => Array
                        (
                            [a] => 15
                            [b] => 18
                        )
                    [1] => Array
                        (
                            [a] => 16
                            [b] => 17
                        )
                    [2] => Array
                        (
                            [a] => 17
                            [b] => 16
                        )
                    [3] => Array
                        (
                            [a] => 18
                            [b] => 15
                        )
                )
        )
    [3] => Array
        (
            [angle] => 29.5
            [pairs] => Array
                (
                    [0] => Array
                        (
                            [a] => 6
                            [b] => 18
                        )
                    [1] => Array
                        (
                            [a] => 18
                            [b] => 6
                        )
                )
        )
)
Теги:
recursion

1 ответ

1
Лучший ответ

Первоначальный возврат прекрасен, но вызовы в цепочке не получают этого результата. В вашем другом вам нужно вернуть результат:

    if($level==sizeof($candidates)-1){ 
        echo "omgggggg";
        return true; 
    }else{
        return findloop($level+1, $pair['b']);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню