За последние 24 часа нас посетили 131109 программистов и 6599 роботов. Сейчас ищут 2232 программиста ...

Не работает рекурсия

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 24 сен 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Надо заполнить массив цифрами, но не получается, ошибка
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes)


    Я уже по всякому пробовал

    PHP:
    1. function rec() {
    2.         $arr = [];
    3.         static $i;
    4.         $i = 0;
    5.         $arr[]=$i;
    6.         $i++;
    7.        
    8.         if($i <= 5) {
    9.             rec();
    10.            
    11.         }
    12.         return $arr;
    13.     }
    14.    
    15.     echo '<pre>';
    16.         print_r(rec());
    17.     echo '</pre>';
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.151
    Симпатии:
    108
    Адрес:
    Украина
    Вы в каждой итерации присваиваете переменной $i значение 0, а потом проверяете, не меньше ли оно 5, если меньше - заново, получается что цикл происходит бесконечно,т.к. значение $i всегда равно 0.
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А зачем для этого извращение с рекурсией? Почему бы не заполнить в обычном цикле или, например, с помощью range() ?
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Так тоже не работает

    PHP:
    1. $a = 0;
    2.     $arr= [];
    3.    
    4.     function func()
    5.     {
    6.         global $a;
    7.         global $arr;
    8.  
    9.         $a++;
    10.        
    11.         $arr[] = $a;
    12.        
    13.         if(count($arr < 5)) {
    14.             $a++;
    15.             return func();
    16.         }
    17.         return $arr;
    18.     }
    19.  
    20.     echo '<pre>';
    21.     print_r(func());
    22.     echo '</pre>';
    --- Добавлено ---
    А зачем вообще учиться программировать, если есть программисты?
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Я сделал работает, но почему, если обернуть в дополнительную функцию, то работать не будет, пишет Undefined index?
    PHP:
    1. $array = [1,2,3,4,5,6,7,8,9];
    2.    
    3.     //function rec($mas) {
    4.         $a = 0;
    5.         $arr= [];
    6.        
    7.         function func($mas) {
    8.             global $a;
    9.             global $arr;
    10.  
    11.             $arr[] = $mas[$a];
    12.            
    13.             $a++;
    14.            
    15.             if(count($arr) < count($mas)) {
    16.                 return func($mas);
    17.             }
    18.             return $arr;
    19.         }
    20.         /*
    21.         if(count($arr) < count($mas)) {
    22.             func($mas);
    23.         }
    24.         */
    25.        
    26.         //return $arr;
    27.        
    28.     //}
    29.  
    30.     echo '<pre>';
    31.     print_r(func($array));
    32.     //print_r(rec($array));
    33.     echo '</pre>';
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Секундочку, сударь! Ваш код не похож на код человека, который учится, а больше смахивает на горе-пилота, который прочитал только инструкцию по взлёту, забил на всё остальное, а теперь просит помощи у наземных служб, чтобы посадить самолет. Если бы вы изучили основы, внимательно прочитали про рекурсии или слушали лекции препода, если такой есть, то подобного бы не написали.
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Я сделал, но почему не добавляет первый элемент? пишет Undefined index

    PHP:
    1. $array = ['h', 1,2,3,4,5,6,7,8,9];
    2.    
    3.     function rec($mas) {
    4.         $a = 0;
    5.         $arr= [];
    6.        
    7.         function func($mas) {
    8.             global $a;
    9.             global $arr;
    10.  
    11.             $arr[] = $mas[$a];
    12.            
    13.             $a++;
    14.            
    15.             if(count($arr) < count($mas)) {
    16.                 return func($mas);
    17.             }
    18.             return $arr;
    19.         }
    20.        
    21.         return func($mas);
    22.        
    23.     }
    24.  
    25.     echo '<pre>';
    26.     print_r(rec($array));
    27.     echo '</pre>';
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Я уже ответил выше. Вы пытаетесь использовать свои недознания для "гадания", вместо того, чтобы использовать знания для решения задачи.
    --- Добавлено ---
    Осторожно, тут есть ребята, которые не стесняются в выражениях ;)
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Не понимаю, почему не видит переменную $a, если я указал, что она глобальная, значит должна взяться из области видимости функции inFoo?

    Как тогда к ней обратиться?

    Код (Text):
    1. function inFoo() {
    2.         $a = 5;
    3.        
    4.         function foo() {
    5.             global $a;
    6.             return $a;
    7.         }
    8.         return foo();
    9.        
    10.     }
    11.    
    12.     echo '<pre>';
    13.     print_r(inFoo());
    14.     echo '</pre>';
    --- Добавлено ---
    Я прорвался

    PHP:
    1. $array = ['h', 1,2,3,4,5,6,7,8,9];
    2.    
    3.     function rec($massiv) {
    4.         $a = 0;
    5.         $arr=[];
    6.        
    7.         function func($massiv, $a, $arr) {
    8.             $arr[] = $massiv[$a];
    9.            
    10.             $a++;
    11.            
    12.             if(count($arr) < count($massiv)) {
    13.                 return func($massiv, $a, $arr);
    14.             }
    15.             return $arr;
    16.            
    17.            
    18.             return $a;
    19.         }
    20.        
    21.        
    22.         return func($massiv, $a, $arr);
    23.        
    24.     }
    25.  
    26.     echo '<pre>';
    27.     print_r(rec($array));
    28.     echo '</pre>';
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    php - не Pascal, в нём нет вложенных функций. Позволено объявлять функцию внутри функции, чтобы работали require, но "внутренняя" функция получает внешнюю область видимости (т.е. работает так же, как если бы была объявлена снаружи).

    Но согласен с @Deonis - решать рекурсией то, что решается циклом в две строчки - глупость. Рекурсией надо решать те задачи, которые без неё не решаются/решаются трудно.
    --- Добавлено ---
    Анонимные функции - исключение. С использованием механизма замыканий можно организовать что-то типа внутренней процедуры/функции Pascal, хотя это и используется немного для другого.
     
    Dimon2x нравится это.