【发布时间】:2020-08-20 11:49:54
【问题描述】:
我在尝试将此递归函数 find_reachable(..) 转换为它的迭代等效项时遇到了麻烦。我环顾四周,看到了使用堆栈的建议,但无法弄清楚。我也认识到这个函数是尾递归的,但不知道如何处理这个信息。 if 声明让我特别难过。任何帮助表示赞赏,谢谢。
void find_reachable(struct person *current, int steps_remaining,
bool *reachable){
// mark current root person as reachable
reachable[person_get_index(current)] = true;
// now deal with this person's acquaintances
if (steps_remaining > 0){
int num_known = person_get_num_known(current);
for (int i = 0; i < num_known; i++){
struct person *acquaintance = person_get_acquaintance(current, i);
find_reachable(acquaintance, steps_remaining - 1, reachable);
}
}
}
.....
struct person {
int person_index; // each person has an index 0..(#people-1)
struct person ** known_people;
int number_of_known_people;
};
// return the person's unique index between zero and #people-1
int person_get_index(struct person * p) {
return p->person_index;
}
// return the number of people known by a person
int person_get_num_known(struct person * p) {
return p->number_of_known_people;
}
// get the index'th person known by p
struct person * person_get_acquaintance(struct person * p, int index) {
//fprintf(stderr, "index %d, num_known %d\n", index, p->number_of_known_people);
assert( (index >= 0) && (index < p->number_of_known_people) );
return p->known_people[index];
}
【问题讨论】:
-
我们很难猜出
person_get_index()、person_get_num_known()和person_get_acquaintance()的功能到底在做什么。如果您不发布那部分代码,您将不会看到很多人可以帮助您。 -
@PierreFrançois 谢谢,我编辑了问题
-
您可能想了解已转换为迭代循环的函数,例如,qsort。
-
Fwiw,这不是尾递归;将尾递归转换为迭代不需要堆栈。
标签: c loops recursion iteration tail-recursion