Полная прозрачность, я не знаю c слишком хорошо, поэтому я использовал псевдокод, в котором я не знал синтаксиса, но что-то вроде этого может сработать?
Общая идея преобразования рекурсии в итерация часто требует добавления в стек объектов (в данном случае людей), требующих обработки. Вы добавляете эти объекты при определенных условиях (в данном случае, если они не слишком глубоко в сети знакомых).
Затем вы выполняете итерацию, пока стек не пуст, извлекая верхний элемент и обрабатывая его. Этап «обработки» обычно также состоит из добавления дополнительных элементов в стек.
Вы фактически имитируете «стек вызовов», который возникает в результате рекурсивной функции.
В этом больше вовлечено, если вам важен порядок, в котором обрабатываются элементы, но в этом случае не похоже, что вы это делаете, поскольку они помечены только как «достижимые».
void find_reachable(struct person *current, int steps_remaining, bool *reachable){
stack = /* create a new stack which contains a (person, int) touple or struct */
stack.push(/* current & steps_remaining*/)
while (/*stack is not empty*/) {
currentStruct = /* pop the top of stack */
current = currentStruct.person
depth = currentStruct.depth
reachable[person_get_index(current)] = true;
if (depth - 1 <= 0) {
continue;
// don't add this person's aquantances b/c we're 'steps_remaining' levels in
}
int num_known = person_get_num_known(current);
for (int i = 0; i < num_known; i++){
struct person *acquaintance = person_get_acquaintance(current, i);
stack.add(/*acquantance & depth - 1*/)
}
}
}
EDIT: улучшенный код