За последние 24 часа нас посетил 22471 программист и 1031 робот. Сейчас ищут 575 программистов ...

Возврат булева значения из рекурсивной функции.

Тема в разделе "PHP для новичков", создана пользователем Познающий php, 21 апр 2017.

  1. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Шалом алейкум!

    Из дерева в функцию заноситься ветка (которая представляет собой скобку из уравнения), нужно проверить нет ли в ней других скобок и если есть то вернуть ФОЛС, если нет то соответственно ТРУ.
    PHP:
    1. function finalBrackets($tree){
    2.     for($i=0;$i<count($tree);$i++){
    3.         if ( is_array($tree[$i])){
    4.             if($i==2 && ($tree[$i][1]=='+'||$tree[$i][1]=='-')){
    5.                 return false;
    6.             }
    7.             else {
    8.                 finalBrackets($tree[$i]);
    9.             }
    10.         }
    11.     }
    12.     return true;
    13. }
    Всегда возвращает ТРУ, хотя заходит в условие где return false. Видимо это связано с множеством запусков функции из-за рекурсии, который один хер будут продолжаться до конца, даже если встретят return false. И в итоге мне вернет значение, которое будет именно в последнем запущенном экземпляре???

    В общем как вернуть фолс по условию?
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Познающий php, вынеси return true тоже в цикл, при каком условии нужно получить true?
     
  3. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    true если ничего не нашел, то бишь просто прошелся по всему дереву. Если хоть раз удовлетворено условие, то вернуть фолс
    PHP:
    1. if($i==2 && ($tree[$i][1]=='+'||$tree[$i][1]=='-')){
    2.           return false;
    3. }
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Познающий php, можешь дать входные данные?
    --- Добавлено ---
    PHP:
    1. function finalBrackets($tree){
    2. $result = true;
    3.     for($i=0;$i<count($tree);$i++){
    4.         if ( is_array($tree[$i])){
    5.             if($i==2 && ($tree[$i][1]=='+'||$tree[$i][1]=='-')){
    6.                $result = false;
    7.                break;
    8.             }
    9.             else {
    10.                 finalBrackets($tree[$i]);
    11.             }
    12.         }
    13.     }
    14.     return $result;
    15. }
    Попробуй так, может поможет.
     
  5. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    PHP:
    1. $aa = array(array(array(4,'*',7),'*',array(-2,'+',array(5,'*','x'))),'+',array(array(2,'*','x'),'*',7));
    неа, не пашет. тру выдает
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    PHP:
    1. function finalBrackets($tree) {
    2.     for ($i = 0; $i < count($tree); $i++) {
    3.         echo "итерация".$i . "\n";
    4.         if (is_array($tree[$i])) {
    5.             if ($i == 2 && ($tree[$i][1] == '+' || $tree[$i][1] == '-')) {
    6.                 echo "конец\n";
    7.                 return false;
    8.             } else {
    9.                 echo "рекурсивный вызов\n";
    10.                 finalBrackets($tree[$i]);
    11.             }
    12.         }
    13.     }
    14.     return true;
    15. }
    При отладке используя входные данные которые три приложил, на выходе получаю вот что.(не знаю, отлаживал ли ты)
    Вникать пока нету времени, еще гляну, можете вывод тебе что либо скажет.

    Код (Text):
    1. итерация0
    2. рекурсивный вызов
    3. итерация0
    4. рекурсивный вызов
    5. итерация0
    6. итерация1
    7. итерация2
    8. итерация1
    9. итерация2
    10. конец
    11. итерация1
    12. итерация2
    13. рекурсивный вызов
    14. итерация0
    15. рекурсивный вызов
    16. итерация0
    17. итерация1
    18. итерация2
    19. итерация1
    20. итерация2