Помогите понять, что не так сделал, и как исправить. Нужно вычислить сумму значений массива с помощью рекурсивной функции. PHP: <?php $arr = [3, 3]; function summa($array) { if (is_array($array)) { $i = count($array) - 1; if (count($array) == 0) return 0; if (count($array) == 1) return $array[$i]; return $array[$i] + summa($array[$i - 1]); } else false; } echo summa($arr); ?>
чтобы понять рекурсию, нужно понять рекурсию чтобы собрать сумму массива тебе нужно собрать именно сумму всех его частей. а у тебя написана какая-то херь. просто пройди циклом по массиву, если это не число, а тоже массив - то вызови эту же функцию, а её результат прибавь к результату этой.
я могу одним словом: херь --- Добавлено --- @mor3uk один раз нужно найти в себе силы понять рекурсию, и дальше сразу навсегда это как на велосипеде кататься
@mor3uk, вот простой пример: Спойлер PHP: function summa($arr) { // 1. Запомним, что функция должна возвращать вычисленное значение $n = count($arr); // 2. Начнем с простого: если массив пуст - суммой его элементов считаем ноль if($n === 0) { return 0; } elseif($n === 1) { // 3. если массив состоит из одного элемента // 3.1 в этом месте можно поступить иначе, убрав единственный элемент из массива // и передав "по рекурсии" далее пустой массив. Но проще сразу вернуть значение. // 3.2 Можно ещё проверить, число ли это... return reset($arr); // 4. массивы ведь могут быть ассоциативные... } else { // 4. Получили массив, содержащий более одного элемента // 4.1 Получаем значение одного из элементов массива и удаляем этот элемент из копии массива, // переданного в функцию (см. описание функции array_pop) // 4.2 Для вычисления суммы оставшихся элементов массива - вызваем функцию summa и // передаем ей оставшийся без одного элемента исходный массив // 4.3 Сохраняем полученный результат в переменную $sum $sum = array_pop($arr) + summa($arr); } // 5. Возвращаем вычисленную сумму. return $sum; } $arr1 = []; $arr2 = [4]; $arr3 = range(1,10); $arr4 = array_combine(range('a','h'), range(1, 8)); $sum1 = summa($arr1); $sum2 = summa($arr2); $sum3 = summa($arr3); $sum4 = summa($arr4); var_dump($arr1, $sum1, $arr2, $sum2, $arr3, $sum3, $arr4, $sum4);
во первых исходный массив абсолютно не подходит для теста рекурсивной функции во вторых рекурсивная функция в своём теле хотя бы раз вызывает саму себя
Спойлер: рекурсия Код (Text): <?php error_reporting(E_ALL); ini_set('display_errors', 'On'); header('Content-Type: text/html; charset=utf-8'); function arr_sum_rec($array = NULL){ $sum = NULL; if(is_array($array)){ foreach($array as $value){ if(is_array($value)){ $sum += arr_sum_rec($value); } if(is_numeric($value)){ $sum += $value; } } }else{ if(is_numeric($array)){ $sum += $array; } } return $sum; } $arr = [1,2,'oops',[[1,2],2,2,2,[2,3,4]],3,4]; echo "<pre>"; //var_dump($arr); print_r ($arr); var_dump(arr_sum_rec()); var_dump(arr_sum_rec(1)); var_dump(arr_sum_rec($arr)); echo "</pre>";
@Valick, просто поиграться с рекурсией, там, где она не необходима. На чём её обычно объясняют почти в 100% учебников программирования? На факториале, который элементарно считается циклом, или числах Фибоначчи, которые тоже можно достаточно просто реализовать циклами.
Ты серьёзно? Я даже подумал, что забыл, что такое факториал, проверил, помню Это элементарный цикл for: PHP: function factorial(int $n) { $f = 1; for ($i =1; $i <= $n; $i++) { $f *= $i; } return $f; }
PHP: function recursiveFactorial(int $n) { return n <= 1 ? 1: $n * recursiveFactorial($n - 1); } Проверку на отрицательные числа лень делать
ну так покажи своё решение =) --- Добавлено --- ты не стесняйся, мы поможем и объясним если че не так
Парень сверху подсказал полезную функцию, я понял, как работает PHP: <?php $arr = [3, 4]; function sum($array) { if (!is_array($array)) return'Введите массив!'; if (count($array) == 0) return 0; $sum = 0; $sum = array_pop($array) + sum($array); return $sum; } echo sum($arr); ?>
главное, что ты понял, что сначала надо скопить в переменную значение текущего элемента и рекурсивный вызов функции --- Добавлено --- предыдущее сообщение тоже было правильное
Я удалил его нечаянно, скажи, ты не мог бы мне помочь ещё кое с чем разобраться пожалуйста, у меня ещё одна тема создана
Последняя активность 2010 год, есть кто? Здравствуйте, опишите пожалуйста как работает этот код? Устал уже медитировать. Код (Text): function func($arr) { $sum = 0; foreach ($arr as $elem) { if (is_array($elem)) { $sum += func($elem); } else { $sum += $elem; } } return $sum; } var_dump(func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]));