Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.181.209] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
>А, что в данном случае является элементарным случаем рекурсии?
Это зависит от того, как рекурсивная функция реализована. Если это счётчик в массиве, то вызов с отрицательным индексом (дошли до первого элемента (индекс 0), увеличили его до предела, попытались вызвать функцию для более левого элемента) |
Сообщ.
#17
,
|
|
|
Еще хотел уточнить такой момент: на каком-то форуме тоже была тема про размещения и там "кинули" готовый код спрашиваемому и в этом коде была рекурсия + какая-то вспомогательная функция, которая вызывалась из рекурсивной, но сама она была простой функцией.
Поэтому хочу сразу понять, можно ли написать ОДНУ рекурсивную функцию, которая будет размещать как надо или это невозможно? |
Сообщ.
#18
,
|
|
|
>ожно ли написать ОДНУ рекурсивную функцию
А зачем больше рекурсивных функций ??? |
Сообщ.
#19
,
|
|
|
Цитата MBo @ А зачем больше рекурсивных функций ??? так я и интересуюсь, т к не знаю просто в том коде была какая-то вспомогательная функция! Цитата MBo @ Если это счётчик в массиве, то вызов с отрицательным индексом (дошли до первого элемента (индекс 0), увеличили его до предела, попытались вызвать функцию для более левого элемента) так, понял вроде нужно попытаться составить заголовок рекурсивной функции (все параметры прокомментированы): //---------------------------------------------------- // Получение размещений с повторениями // pv - последовательность размещаемых объектов/цифр // pi - индекс переставляемого объекта/цифры (отсчет по правилам массивов С++) // pmaxValue - максимальное значение, принимаемое объектом/цифрой // pID - номер текущей последовательности (нужно для вывода на экран) //---------------------------------------------------- void Deployment(int *pv, int pi, int pmaxValue, int pID) { } //---------------------------------------------------- из функции main() первый раз вызывается так: Deployment(v, count - 1, maxValue, ID); тут все норм. или что-то не учтено, что пригодится? |
Сообщ.
#20
,
|
|
|
В итоге чертовщина какая-то получилась, т к до конца еще не разобрался с этим алгоритмом:
//---------------------------------------------------- // Получение размещений с повторениями // pv - последовательность размещаемых объектов/цифр // pi - индекс переставляемого объекта/цифры (отсчет по правилам массивов С++) // pmaxValue - максимальное значение, принимаемое объектом/цифрой // pID - номер текущей последовательности (нужно для вывода на экран) // pcount - количество объектов/цифр в последовательности //---------------------------------------------------- void Deployment(int *pv, int pi, int pmaxValue, int pID, int pcount) { if(pi >= 0) // когда pi = -1, то процедура закончена! { PrintSequence(pv, pcount, pID); if(pv[pi] < pmaxValue) { pv[pi]++; Deployment(pv, pi, pmaxValue, ++pID, pcount); } else { pv[pi - 1]++; pv[pi] = 1; Deployment(pv, pi - 1, pmaxValue, ++pID, pcount); } } } //---------------------------------------------------- Есть следующие вопросы: 1. Если рекурсия на спуске, то получаем в возрастающем лексикографическом порядке, а, если на возврате, то в убывающем, да? 2. В теле рекурсивной функции не должно быть никаких циклов? Вообще рек.функция должна выполнять действия: либо увеличение на 1 нужной цифры, либо переход на следующий разряд, стоящий слева от текущего и увеличение его на 1, и выставление какого-то разряда в 1? 3. Есть что-то общее в этой рек.функции с рек.функциями, которые используют в сильноветвящихся деревьях? Допустим, дано 4 объекта, которые принимают значения {1, 2} 1: 1111 2: 1112 3: 1121 4: 1122 5: 1211 ... Вот мне абсолютно непонятно по цепочке 1211, на каких копиях рекурсивных функциях будут выставлены 1 и 1 в двух правых цифрах. P.S. Бинарные деревья поиска и то были более понятными... |
Сообщ.
#21
,
|
|
|
Если неприменно нужна рекурсия, вот:
Const N As Long = 3, M As Long = 2 Dim Ar(N - 1) As Long Sub Main() Dim i As Long For i = 0 To N - 1 Ar(i) = 1 Next i NextVal End Sub Sub NextVal() Dim i As Long PrintAr i = N - 1 While i >= 0 Ar(i) = Ar(i) + 1 If Ar(i) > M Then Ar(i) = 1 i = i - 1 Else NextVal Exit Sub End If Wend End Sub Sub PrintAr() Dim i As Long For i = 0 To N - 1 Debug.Print Ar(i); Next i Debug.Print End Sub |
Сообщ.
#22
,
|
|
|
sub recurse(currentvariant, currentlevel) if currentlevel = 0 then print currentvariant else for i = 1 to statescount call recurse(currentvariant & states(i), currentlevel - 1) next i end if end sub ' recurse public const statescount = someinteger public states(1 to statescount) as sometype sub Main for i = 1 to statescount states(i) = somevalue next i call recurse(empty, levelsneeded) end sub ' Main |
Сообщ.
#23
,
|
|
|
for i in 1 to C
GENERATE_Random_Pemutation вот весь код С = максимальное количество пермутаций * логарифм от максимального количества пермутаций умножить на 10 Алгоритм вероятностный |