За последние 24 часа нас посетили 17935 программистов и 1574 робота. Сейчас ищет 1291 программист ...

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

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

  1. mor3uk

    mor3uk Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    13
    Симпатии:
    0
    Помогите понять, что не так сделал, и как исправить. Нужно вычислить сумму значений массива с помощью рекурсивной функции.
    PHP:
    1. <?php
    2.     $arr = [3, 3];
    3.     function summa($array)
    4.     {
    5.         if (is_array($array))
    6.         {
    7.             $i = count($array) - 1;
    8.             if (count($array) == 0) return 0;
    9.             if (count($array) == 1) return $array[$i];
    10.             return $array[$i] + summa($array[$i - 1]);
    11.         }
    12.         else false;
    13.     }
    14.     echo summa($arr);
    15. ?>
     
    #1 mor3uk, 23 авг 2018
    Последнее редактирование модератором: 23 авг 2018
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чтобы понять рекурсию, нужно понять рекурсию

    чтобы собрать сумму массива тебе нужно собрать именно сумму всех его частей. а у тебя написана какая-то херь.

    просто пройди циклом по массиву, если это не число, а тоже массив - то вызови эту же функцию, а её результат прибавь к результату этой.
     
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Ты словами можешь описать алгоритм который написал?
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я могу одним словом: херь
    --- Добавлено ---
    @mor3uk
    один раз нужно найти в себе силы понять рекурсию, и дальше сразу навсегда
    это как на велосипеде кататься
     
    Dron-Boy нравится это.
  5. mor3uk

    mor3uk Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    13
    Симпатии:
    0
    Спасибо, попытаюсь
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну, видимо, учебное задание такое - сделать именно рекурсией, а не циклом.
     
    mor3uk нравится это.
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @mor3uk, вот простой пример:
    PHP:
    1. function summa($arr) { // 1. Запомним, что функция должна возвращать вычисленное значение
    2.     $n = count($arr);
    3.     // 2. Начнем с простого: если массив пуст - суммой его элементов считаем ноль
    4.     if($n === 0) {
    5.         return 0;
    6.     } elseif($n === 1) { // 3. если массив состоит из одного элемента
    7.         // 3.1 в этом месте можно поступить иначе, убрав единственный элемент из массива
    8.         // и передав "по рекурсии" далее пустой массив. Но проще сразу вернуть значение.
    9.         // 3.2 Можно ещё проверить, число ли это...
    10.         return reset($arr); // 4. массивы ведь могут быть ассоциативные...
    11.     } else {
    12.         // 4. Получили массив, содержащий более одного элемента
    13.         // 4.1 Получаем значение одного из элементов массива и удаляем этот элемент из копии массива,
    14.         // переданного в функцию (см. описание функции array_pop)
    15.         // 4.2 Для вычисления суммы оставшихся элементов массива - вызваем функцию summa и
    16.         // передаем ей оставшийся без одного элемента исходный массив
    17.         // 4.3 Сохраняем полученный результат в переменную $sum
    18.         $sum = array_pop($arr) + summa($arr);
    19.     }
    20.     // 5. Возвращаем вычисленную сумму.
    21.     return $sum;
    22. }
    23. $arr1 = [];
    24. $arr2 = [4];
    25. $arr3 = range(1,10);
    26. $arr4 = array_combine(range('a','h'), range(1, 8));
    27. $sum1 = summa($arr1);
    28. $sum2 = summa($arr2);
    29. $sum3 = summa($arr3);
    30. $sum4 = summa($arr4);
    31. var_dump($arr1, $sum1, $arr2, $sum2, $arr3, $sum3, $arr4, $sum4);
     
  8. mor3uk

    mor3uk Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    13
    Симпатии:
    0
    Спасибо
     
  9. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    вы не поняли, речь шла именно о рекурсивном вызове цикла, вложенные итерации
     
    #9 Valick, 23 авг 2018
    Последнее редактирование: 23 авг 2018
  10. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    во первых исходный массив абсолютно не подходит для теста рекурсивной функции
    во вторых рекурсивная функция в своём теле хотя бы раз вызывает саму себя
     
  11. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Код (Text):
    1. <?php
    2. error_reporting(E_ALL);
    3. ini_set('display_errors', 'On');
    4. header('Content-Type: text/html; charset=utf-8');
    5.  
    6. function arr_sum_rec($array = NULL){
    7.     $sum = NULL;
    8.     if(is_array($array)){
    9.         foreach($array as $value){
    10.             if(is_array($value)){
    11.                 $sum += arr_sum_rec($value);
    12.             }
    13.             if(is_numeric($value)){
    14.                 $sum += $value;
    15.             }
    16.         }
    17.     }else{
    18.         if(is_numeric($array)){
    19.                 $sum += $array;
    20.             }
    21.     }
    22.     return $sum;
    23. }
    24.  
    25. $arr = [1,2,'oops',[[1,2],2,2,2,[2,3,4]],3,4];
    26.  
    27. echo "<pre>";
    28. //var_dump($arr);
    29. print_r ($arr);
    30.  
    31. var_dump(arr_sum_rec());
    32. var_dump(arr_sum_rec(1));
    33. var_dump(arr_sum_rec($arr));
    34. echo "</pre>";
     
    #11 Valick, 24 авг 2018
    Последнее редактирование: 24 авг 2018
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Valick, ну ТС нигде не писал, что есть вложенные массивы.
     
  13. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @mkramer, без вложенных массивов нет рекурсии.
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Valick, просто поиграться с рекурсией, там, где она не необходима. На чём её обычно объясняют почти в 100% учебников программирования? На факториале, который элементарно считается циклом, или числах Фибоначчи, которые тоже можно достаточно просто реализовать циклами.
     
  15. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @mkramer, давай код факториала циклами.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ты серьёзно? Я даже подумал, что забыл, что такое факториал, проверил, помню :) Это элементарный цикл for:
    PHP:
    1. function factorial(int $n) {
    2.      $f = 1;
    3.      for ($i =1; $i <= $n; $i++) {
    4.          $f *= $i;
    5.     }
    6.     return $f;
    7. }
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    давай код факториала рекурсией (это кстати напоминает исходную задачу ТС)
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    PHP:
    1. function recursiveFactorial(int $n) {
    2.     return n <= 1 ? 1: $n * recursiveFactorial($n - 1);
    3. }
    Проверку на отрицательные числа лень делать :)
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    красиво
    --- Добавлено ---
    @mor3uk
    ты как? Вкурил?
     
  20. mor3uk

    mor3uk Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    13
    Симпатии:
    0
    Надеюсь, что вкурил)
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну так покажи своё решение =)
    --- Добавлено ---
    ты не стесняйся, мы поможем и объясним если че не так
     
  22. mor3uk

    mor3uk Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    13
    Симпатии:
    0
    Парень сверху подсказал полезную функцию, я понял, как работает
    PHP:
    1. <?php
    2. $arr = [3, 4];
    3. function sum($array)
    4. {
    5. if (!is_array($array)) return'Введите массив!';
    6. if (count($array) == 0) return 0;
    7. $sum = 0;
    8. $sum = array_pop($array) + sum($array);
    9. return $sum;
    10. }
    11. echo sum($arr);
    12. ?>
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    главное, что ты понял, что сначала надо скопить в переменную значение текущего элемента и рекурсивный вызов функции
    --- Добавлено ---
    предыдущее сообщение тоже было правильное
     
  24. mor3uk

    mor3uk Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    13
    Симпатии:
    0
    Я удалил его нечаянно, скажи, ты не мог бы мне помочь ещё кое с чем разобраться пожалуйста, у меня ещё одна тема создана
     
  25. petrovmlq

    petrovmlq Новичок

    С нами с:
    Четверг
    Сообщения:
    3
    Симпатии:
    0
    Последняя активность 2010 год, есть кто?
    Здравствуйте, опишите пожалуйста как работает этот код?
    Устал уже медитировать.

    Код (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]]]]));
     
    #25 petrovmlq, 19 дек 2024 в 16:29
    Последнее редактирование: 19 дек 2024 в 16:36