Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1

Рекурсия в функции

21.03.2016, 07:22. Показов 1513. Ответов 18

Студворк — интернет-сервис помощи студентам
Как сделать рекурсию в функции remDub ($aArray):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
header("Content-Type:text/html; charset=UTF-8"); 
ini_set('display_errors', 1); 
error_reporting(E_ALL);
 
function printArray ($aArray) {
    print '<pre>';
    print_r ($aArray);
    print '</pre>';
    echo ('<hr>');
}
 
function remDub ($aArray) { 
    $nCountArray = count ($aArray);
    $n = 0;
    $aTemp[] = $aArray[$n];
    for ($i = $n + 1; $i < $nCountArray; $i++) {
    
        if ($aArray[$n] != $aArray[$i]) {
        
            $aTemp[] = $aArray[$i];
        
        };
        
    };
    $aArray = $aTemp;
    $n = $n + 1;
    
    return $aArray;
    
}
 
$aArr = array (1, 3, 4, 1, 5, 3, 6, 1, 4, 3, 5, 1); # array (1, 3, 4, 5, 6);
 
printArray ($aArr);
 
$aTemp = remDub ($aArr);
echo ('На выходе:');
printArray ($aTemp);
?>
Чтобы на выходе получить следующее: array (1, 3, 4, 5, 6);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2016, 07:22
Ответы с готовыми решениями:

Рекурсия внутри функции
Имеем найденный на просторах пример: // Массив $tree = array( '1' =&gt; array( '1.1' =&gt; array(), '1.2'...

Рекурсия: после отработки вложенной функции foreach перестает делать предыдущий обход
Всем привет! Делаю иерархию БД. Проблема в следующем: после отработки вложенной функции foreach перестает делать предыдущий обход, в...

Функции и рекурсия: вычислить значение составной функции
Помогите решить задачку, с использованием операторов ветвления if, if-else и switch. Вычислить и вывести на экран все значение...

18
55 / 55 / 21
Регистрация: 01.03.2016
Сообщений: 594
21.03.2016, 07:40
Gcom, Память нужно экономить! )
PHP
1
2
3
4
5
6
7
8
9
10
function remDub ($aArray) { 
    
    $aArray2 = array();
    foreach($aArray as $val){
        if(!isset($aArray2[$val])){
            $aArray2[] = $val;
        }
    }
    return $aArray2;
}
вот ваша фун-я в правильном виде.
И вопрос: какова вообще цель рекурсии ?
1
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
21.03.2016, 07:51  [ТС]
Цитата Сообщение от 53ifbb Посмотреть сообщение
Память нужно экономить! )
Важный момент, не спорю.
Цитата Сообщение от 53ifbb Посмотреть сообщение
какова вообще цель рекурсии ?
Получить итоговый массив array (1, 3, 4, 5, 6);
Хотя это развилка основной задачи основной задачи решил пойти по этому пути, а потом эту функцию адаптировать под основную задачу.
Может я опять выбрал не правильный путь, но другого пути опять же я не вижу в своих мыслях.

Добавлено через 2 минуты
Цитата Сообщение от 53ifbb Посмотреть сообщение
вот ваша фун-я в правильном виде.
Если с учетом основной задачи, то она выглядит уже так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function remDub ($aArray) { 
    $nCountArray = count ($aArray);
    $n = 0;
    $aTemp[] = $aArray[$n];
    for ($i = $n + 1; $i < $nCountArray; $i++) {
    
        if ($aArray[$n]['KEY1'] != $aArray[$i]['KEY1']) {
        
            $aTemp[] = $aArray[$i];
        
        };
        
    };
    $aArray = $aTemp;
    $n = $n + 1;
    
    return $aArray;
    
}
Добавлено через 1 минуту
53ifbb, Вот такие вот мы изобретаем велосипеды
0
55 / 55 / 21
Регистрация: 01.03.2016
Сообщений: 594
21.03.2016, 07:58
Gcom, а что тот вариант, что я написал разве не возвращает массив без дублей ?

Добавлено через 3 минуты
зачем это: $n = 0; зачем это: $i = $n И это то зачем!!: $n = $n + 1;
Вы не до конца почитали про цикл for ! так ни пишут)

Добавлено через 1 минуту
Отправте в мою фун-ю $aArr = array (1, 3, 4, 1, 5, 3, 6, 1, 4, 3, 5, 1); и получите желаемый результат.
Какая рекурсия, вы о чем ? если так все писать то и сервера не хватит

Добавлено через 1 минуту
у вас $i это номер итерации, а вы его сверяете со значением массива!!

Конечно будет неожиданный результат
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
21.03.2016, 08:10  [ТС]
Цитата Сообщение от 53ifbb Посмотреть сообщение
Gcom, а что тот вариант, что я написал разве не возвращает массив без дублей ?
В эту функцию будет еще передаваться массив с ключами, по которым нужно искать дубли:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function remDub ($aArray, $aKEY) {  
    $nCountArray = count ($aArray);
    $n = 0;
    $aTemp[] = $aArray[$n];
    for ($i = $n + 1; $i < $nCountArray; $i++) {
    
        if (
            ($aArray[$n][$aKEY[0]] != $aArray[$i][$aKEY[0]]) &&
            ($aArray[$n][$aKEY[1]] != $aArray[$i][$aKEY[1]]) &&
            ($aArray[$n][$aKEY[2]] != $aArray[$i][$aKEY[2]]) ) {
        
            $aTemp[] = $aArray[$i];
        
        };
        
    };
    $aArray = $aTemp;
    $n = $n + 1;
    
    return $aArray;
    
}
$aKeyArray = array ('KEY1', 'KEY4', 'KEY6'); # Массив с ключами ("KEY1", "KEY4", "KEY6")
$aTemp = remDub ($aArr, $aKeyArray);
Добавлено через 2 минуты
Цитата Сообщение от 53ifbb Посмотреть сообщение
зачем это: $n = 0; зачем это: $i = $n И это то зачем!!: $n = $n + 1;
Вы не до конца почитали про цикл for ! так ни пишут)
Его не надо до конца читать, рекурсия и нужна, что бы каждый новый раз цикл перебрался со следующего элемента массива $aArray

Добавлено через 4 минуты
Т.е. я придумал такой алгоритм, берем первый элемент массива $aArray, помещаем его в $aTemp, затем берем последующие элементы массива $aArray, и сравниваем с первым элементом, если не равны элементы, то помещаем текущий элемент в $aTemp, элементы кончились, перезаписываем $aArray массивом $aTemp, и повторяем процедуру, но уже со второго элемента, т.к. по первому элементу дублей в массиве уже нет. Почему и нужна рекурсия.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
21.03.2016, 09:00
Gcom,
Цитата Сообщение от Gcom Посмотреть сообщение
рекурсия и нужна, что бы каждый новый раз цикл перебрался со следующего элемента
А вложенные циклы не пробовали?
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
21.03.2016, 12:18  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
А вложенные циклы не пробовали?
Побывал, но чет не работает
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function remDub ($aArray) { 
    
    for ($n = 0; $n < count ($aArray); $n++) {
    
        $nCountArray = count ($aArray);
        #$n = 0;
        $aTemp[] = $aArray[$n];
        for ($i = $n + 1; $i < $nCountArray; $i++) {
    
            if ($aArray[$n] != $aArray[$i]) {
        
                $aTemp[] = $aArray[$i];
        
            };
        
        };
    
        unset($aArray);
        $aArray = $aTemp;
        #$n = $n + 1;
    };
    
    return $aArray;
    
}
Хотя по идеи должно работать так как надо, но выдает ошибку:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) in on line 19
PHP
1
$aTemp[] = $aArray[$n];
Добавлено через 11 минут
Почему так происходит, понять не могу:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function remDub ($aArray) {
 
    $nCountIn = count ($aArray);
    
    for ($n = 0; $n < $nCountIn ; $n++) {
    
        echo ('n= '.$n.' nCountIn = '.$nCountIn.'<br>');
        $nCountArray = count ($aArray);
        $aTemp[] = $aArray[$n];
 
        for ($i = $n + 1; $i < $nCountArray; $i++) {
    
            if ($aArray[$n] != $aArray[$i]) {
        
                $aTemp[] = $aArray[$i];
        
            };
        
        };
    
        unset($aArray);
        $aArray = $aTemp;
        $nCountIn = count ($aArray); 
 
    };
    
    return $aArray;
    
}
Выводит:
n= 0 nCountIn = 12
n= 1 nCountIn = 9
n= 2 nCountIn = 15
n= 3 nCountIn = 25
n= 4 nCountIn = 40
n= 5 nCountIn = 65
n= 6 nCountIn = 110
n= 7 nCountIn = 183
n= 8 nCountIn = 312
n= 9 nCountIn = 489
n= 10 nCountIn = 874
n= 11 nCountIn = 1483
n= 12 nCountIn = 2444
n= 13 nCountIn = 3853
n= 14 nCountIn = 6670
n= 15 nCountIn = 11279
n= 16 nCountIn = 20496
n= 17 nCountIn = 36881
n= 18 nCountIn = 61458
n= 19 nCountIn = 90131
n= 20 nCountIn = 155668
n= 21 nCountIn = 278549
n= 22 nCountIn = 507926
n= 23 nCountIn = 950295
n= 24 nCountIn = 1376280

Ну и потом вываливается ошибка

Добавлено через 3 часа 3 минуты
Решил.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
header("Content-Type:text/html; charset=UTF-8"); 
ini_set('display_errors', 1); 
error_reporting(E_ALL);
 
function printArray ($aArray) {
    print '<pre>';
    print_r ($aArray);
    print '</pre>';
    echo ('<hr>');
}
 
function remDub ($aArray) {
    $aTemp = array ();
    for ($n = 0; $n < count ($aArray) ; $n++) {
        $aTemp = array ();
        
        if (isset ($aArray[$n])) {
            for ($m = 0; $m < $n + 1; $m++) {
                $aTemp[] = $aArray[$m];
            };
        };
        for ($i = $n + 1; $i < count ($aArray); $i++) {
 
            if ($aArray[$n] != $aArray[$i]) {
                $aTemp[] = $aArray[$i];
            };
        };
        $aArray = $aTemp;
    };
    
    return $aArray;
    
}
 
$aArr = array (1, 3, 4, 1, 5, 3, 6, 1, 4, 3, 5, 1); # array (1, 3, 4, 5, 6);
 
printArray ($aArr);
 
$aTempArray = remDub ($aArr);
echo ('На выходе:');
printArray ($aTempArray);
?>
0
467 / 431 / 117
Регистрация: 15.02.2012
Сообщений: 1,952
21.03.2016, 15:23
а вам нужна именно своя функция? такой вариант нет?
PHP
1
2
3
4
5
6
7
$aArr = array (1, 3, 4, 1, 5, 3, 6, 1, 4, 3, 5, 1); # array (1, 3, 4, 5, 6);
 
printArray ($aArr);
 
$aTempArray = array_unique($aArr);
echo ('На выходе:');
printArray ($aTempArray);
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
21.03.2016, 16:42
tgarl, у array_unique ключи сохраняются прежние.
0
467 / 431 / 117
Регистрация: 15.02.2012
Сообщений: 1,952
21.03.2016, 17:07
да, остаются, а вроде нигде не говорилось, что ключи нужно обнулить.
0
21.03.2016, 19:50

Не по теме:

Хорошо сформулированный вопрос это уже 50% решения.
Вопрос данной темы не сформулирован вообще :D Шансов решить правильно - 0%.

0
21.03.2016, 22:09

Не по теме:

Цитата Сообщение от pav1uxa Посмотреть сообщение
Хорошо сформулированный вопрос это уже 50% решения.
Вопрос данной темы не сформулирован вообще Шансов решить правильно - 0%.
да тут вообще тяжёлый случай
решение то уже дано
вымученное пытками заказчика

0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
22.03.2016, 05:48  [ТС]
Цитата Сообщение от tgarl Посмотреть сообщение
а вам нужна именно своя функция? такой вариант нет?
Результаты разные, решением данной задачи, это поиск алгоритма перебора элементов массива, и ликвидация их в процессе.

Не по теме:

Цитата Сообщение от полудух Посмотреть сообщение
да тут вообще тяжёлый случай
решение то уже дано
вымученное пытками заказчика
Я уже писал Вам в той теме, что данный подход в моем случае не подходит (не совсем соответствует ТЗ), хотя и вариант и рабочий.
Я всегда пытаюсь четко сформулировать задачу, но иной раз это не всегда получается с первого раза.

0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
22.03.2016, 09:42
Цитата Сообщение от Gcom Посмотреть сообщение
Я уже писал Вам в той теме, что данный подход в моем случае не подходит (не совсем соответствует ТЗ), хотя и вариант и рабочий.
Я всегда пытаюсь четко сформулировать задачу, но иной раз это не всегда получается с первого раза.
а, так это вы серьёзно не в состоянии заменить 'KEY'.$key на $key
печально
0
22.03.2016, 09:51  [ТС]

Не по теме:

Цитата Сообщение от полудух Посмотреть сообщение
печально
Я не волшебник, я только учусь ;)
Встретив:
PHP
1
function fix_doubles(&$n)
Я не стал разбираться дальше, смысл смотреть дальше, если это уже выше моего понимания. Но за Ваши труды я все равно сказал СПС.

0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
22.03.2016, 09:56
Цитата Сообщение от Gcom Посмотреть сообщение
Я всегда пытаюсь четко сформулировать задачу, но иной раз это не всегда получается с первого раза.
Но тут Вы даже не пытались этого сделать. Вы написали что Вам из array(1, 3, 4, 1, 5, 3, 6, 1, 4, 3, 5, 1) нужно получить array(1, 3, 4, 5, 6). Это делается одной встроенной функцией PHP, как Вам тут показали.
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
22.03.2016, 10:00  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
Это делается одной встроенной функцией PHP
Если бы я о ней знал, я бы стал так формулировать свою задачу? В следующий раз я постараюсь уточнить про то что не знаю
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
22.03.2016, 10:03
Цитата Сообщение от Gcom Посмотреть сообщение
Я не стал разбираться дальше, смысл смотреть дальше, если это уже выше моего понимания. Но за Ваши труды я все равно сказал СПС.
ага, а зачем
зачем напрягаться и анализировать код, на который люди потратили время и силы, чтобы у вас заработало
а то что обычно такие мозгоправки заказчика стоят 1-2тыр/час это пустяки
тут же ещё 100500 строк кода накидают нахаляву
потрахаю форуму мозги ещё недельку
народу то ведь больше нечем заняться
ппц, помогай людям после этого
0
 Аватар для Gcom
82 / 82 / 18
Регистрация: 03.02.2016
Сообщений: 564
Записей в блоге: 1
22.03.2016, 10:16  [ТС]
Цитата Сообщение от полудух Посмотреть сообщение
на который люди потратили время и силы, чтобы у вас заработало
Я Вам за это сказал СПС, некоторые даже и этого не делают.
Я просто не вижу смысла использовать тот код который мне не понятен, в виду того что я даже его как шаблон не смогу использовать в будущем. Вы просто поймите уровень знаний у всех разный, то что понятно Вам это не значит что понятен для других, да и тут ветка форума так и называется "Форум PHP для начинающих", не вижу смысла тут писать мега код, в котором начинающий вообще не чего не соображает, получается это у Вас не правильный подход изначально, а пытаетесь свалить вину на новичков. Надеюсь я до Вас достучался и все выше сказанное Вы примите к сведению, при очередной попытке помочь новичкам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2016, 10:16
Помогаю со студенческими работами здесь

Рекурсия, функции.
Не знаете, как расписать S=1+2+3+4+5... с помощью рекурсии не знаєте як розпсати S=1+2+3+4+5... за допомогою рекурсії Язык...

рекурсия функции
Так выглядит оригинал задания. Найти сумму ряда с точностью эпселент , общий член которого равен n Точность считается достигнутой, если...

Функции. Рекурсия.
Пишем в Microsoft Visual Studio -&gt; Win32 Console Application -&gt; C++. С помощью Рекурсий. Условие задачи : Перемещение N дисков может...

Функции рекурсия
Дайте пример рекурсии:wall::cry:

Функции (рекурсия)
Помогите, пожалуйста, решить задачи!!!!! Задание №1: Для заданного натурального числа n вычислить n-й член рекуррентной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru