我有一个返回树的第一个节点的函数,
node* primeiro(tree r){
while(r->left != NULL){
r = r->left;
}
return r;
}
顺便说一句,打击乐是按顺序制作的。所以函数返回树的最左边的叶子,函数假定树不是空的。如何以递归方式实现它?
node* primeiro (tree r) {
while (r->left != NULL) {
r = primeiro (r->left);
}
return r;
}
这不起作用。
答案 0 :(得分:2)
问题在于使用while
。您需要简单的recursion termination condition。
node* primeiro (tree r) {
if (r->left != NULL) {
r = primeiro (r->left);
}
return r;
}
答案 1 :(得分:0)
而不是使用条件 r-> left!= NULL for while循环,检查它是true还是false。 (这将是终止递归的基本条件)。
答案 2 :(得分:0)
当我们谈到“递归函数”时,我们通常指的是“使用递归循环的函数”......
您的两个函数都使用while
循环。您应该专注于将while
循环转换为递归函数调用。
考虑这个循环:
int fubar(int x) {
while (x > 0) {
x--;
}
return x;
}
它转变为:
int fubar(int x) {
if (x > 0) {
return fubar(x - 1);
}
return x;
}
注意两者有多相似。不同之处是:
x
,而是通过在x
值
if
语句中,而不是while
... while
进行循环;相反,你应该再次调用fubar
,传入一个新值并返回其结果。重要提示:可能significant benefits确保每次递归函数调用都会立即返回(不需要任何中间计算)。
答案 3 :(得分:0)
当迭代被递归替换时,从无限递归循环开始可能更容易派生正确的代码:
node* primeiro(tree r){
/* What goes in the recursive loop body? */
return primeiro(r);
}
您现在可以询问迭代的下一个值是什么,以及循环何时停止。下一个值非常简单。
node* primeiro(tree r){
/* When does the recursive loop stop? */
r = r->left;
return primeiro(r);
}
从while
循环逻辑开始,当r->left
为NULL
时,循环停止。此时,您将返回r
。
node* primeiro(tree r){
if (r->left == NULL) return r;
r = r->left;
return primeiro(r);
}