За последние 24 часа нас посетили 17995 программистов и 1577 роботов. Сейчас ищут 870 программистов ...

Вычисление суммы значений массива с помощью рекурсии

Тема в разделе "PHP для новичков", создана пользователем mor3uk, 23 авг 2018.

  1. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    какой-то слишком толстый троллинг, не? наверное следующим сообщением будет какая-нибудь говноссылка.
     
  2. bimply

    bimply Активный пользователь

    С нами с:
    13 авг 2012
    Сообщения:
    444
    Симпатии:
    13
    вычисляет факториал элементов массива по распределению гаусса
     
  3. petrovmlq

    petrovmlq Новичок

    С нами с:
    Четверг
    Сообщения:
    3
    Симпатии:
    0
    Если бы это было так, и мне делать было нехер, то было бы прекрасно, но это не так.

    Я ученик и ветка для новичков, что не так?

    Вот код:
    Код (Text):
    1.   function func($arr) {
    2.         $sum = 0;
    3.  
    4.         foreach ($arr as $elem) {
    5.             if (is_array($elem)) {
    6.                 $sum += func($elem);
    7.             } else {
    8.                 $sum += $elem;
    9.             }
    10.         }
    11.  
    12.         return $sum;
    13.     }
    14.  
    15.     var_dump(func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]));
    1 итерация: $elem - это не массив, выполняется else, в $sum записывается 1.
    2 итерация: $elem - это массив, в $sum записывается 1 + ($elem - это уже не массив, должно выполнится else и оно выполняется), а нахера мы начинали записывать тогда после проверки $elem на массив что-то в $sum ?
    И если написать вместо $sum += func($elem);
    вот так:
    Код (Text):
    1.  
    2. func($elem);
    то ничего не работает, вот и прошу Вас описать последовательно как работает код, не сложно же для Вас, судя по всему?
     
    #28 petrovmlq, 20 дек 2024 в 20:14
    Последнее редактирование: 20 дек 2024 в 20:23
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @petrovmlq Всё просто. У нас рекурсивная структура данных, а именно - числовой массив, который может в себе содержать другие числовые массивы. Тут главной понимать, как работают вызовы и локальные переменные. А работают они благодаря стеку вызовов. При каждом вложенном вызове $sum, которая в конце возвращается, своя. Таким образом алгоритм сводится к следующему:
    1. Начинаем цикл по всем элементам массива, чтоб посчитать его сумму
    2. Если очередной элемент - просто число, прибавляем его к $sum
    3. Если же очередной элемент массив, считаем сумму его элементов, и прибавляем эту сумму к нашему $sum
    Таким образом, при приведённых данных, вызов функции func верхнего уровня сначала к своему $sum прибавит 1, потом прибавит сумму чисел 2, 7 и 8, т.е. 17, ну и так далее.

    Самое главное - понять, что каждый вложенный вызов работает со своими аргументами, и со своими локальными переменными. Если непонятно объяснил, загугли "стек вызовов". Рекурсия - тот случай, когда надо понимать не только как пользоваться, но и благодаря чему оно работает.
     
    petrovmlq нравится это.
  5. petrovmlq

    petrovmlq Новичок

    С нами с:
    Четверг
    Сообщения:
    3
    Симпатии:
    0
    [QUOTE="mkramer"[/QUOTE]
    Спасибо, за помощь. Изучаю теперь, как работает память. Это какой-то атас.
     
    #30 petrovmlq, 21 дек 2024 в 05:39
    Последнее редактирование: 21 дек 2024 в 05:50