树函数的递归代码?

时间:2017-08-28 19:26:38

标签: c recursion tree nodes

我有一个返回树的第一个节点的函数,

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;
}

这不起作用。

4 个答案:

答案 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->leftNULL时,循环停止。此时,您将返回r

node* primeiro(tree r){
    if (r->left == NULL) return r;
    r = r->left;
    return primeiro(r);
}
相关问题