Допустим, у меня есть функция, реализующая циклы и рекурсию:
public void Foo(int para1, int para2, bool is_leaf_node)
{
if(is_leaf_node)
//do something
else
{
//do something
while(some_condition)
{
//assign variable to be passed to next recursive call
Foo(para1_next,para2_next,is_leaf_node_next);
}
}
}
Используя этот тип дизайна, я могу сделать неопределенное количество вложенных циклов. В результате получается что-то вроде этого:
while(condition1)
{
//do something
while(condition2)
{
//do something
//keep nested looping
//until the last one (is_leaf_node == true) which don't have a while loop
}
}
Но из того, что я читаю онлайн ( этот вопрос ), похоже, что большинство из них согласны с тем, что то, что можно сделать с помощью рекурсии, может быть сделано также с использованием циклов (если единственной проблемой является получение выходных данных). В ответе / комментарии говорится, что «по сути, создание циклов вместо рекурсии означает ручную обработку стека», но практически, как мне «обработать стек» в этом сценарии? Нужен ли мне указатель или что-то еще для этого?
Кто-то может спросить: «Зачем использовать цикл, если вы можете сделать с рекурсией? В какой ситуации вы можете использовать только цикл?». Ну, мне просто любопытно, как это можно сделать, используя только циклы без рекурсии.
Может ли кто-нибудь предоставить дизайн:
- только петля
- без рекурсии
- может выполнять неопределенное число вложенных циклов
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Давайте рассмотрим положительный целочисленный параметр nested
, который сообщает программе, сколько нужно вложенных циклов.
Например, алгоритм выдаст что-то вроде этого, если nested == 3
:
while(condition1)
while(condition2)
while(condition3)
//do something
Если nested == 4
while(condition1)
while(condition2)
while(condition3)
while(condition4)
//do something
Если nested == 0
//do something
Описание изображения:
Давайте возьмем зацикливание древовидной структуры в качестве примера. На этом изображении Height of tree
- это 2
, что также представляет amount of nested loop needed
и nested
в предыдущем описании, и это также сбалансированное двоичное дерево, поэтому, используя только циклы, мы можем сделать что-то подобное.
int i =0;
while(i<2)
{
int j =0;
while(j<2)
{
//do something, ie:
std::cout<<arr[i][j];
j++;
}
i++;
}
, в котором i
представляет индекс Level 1
, j
представляет индекс Level 2
.
Но что, если Height of tree
или depth of tree
неизвестны до выполнения и не сбалансированы? Дерево может иметь 3 уровня на первом пути вниз и 5 уровней на втором пути вниз. Единственное решение, которое я могу придумать, - это реализовать и рекурсию, и циклы, которые выглядят примерно так, как код, который я написал в первом разделе кода. Итак, не используя рекурсию, как мы можем пройти через древовидную структуру, которая height
или depth
неизвестна, не обязательно сбалансирована и начинается с корня?