C++中的递归函数调用

recursive function calling in c++

有什么区别

return(checkBst(root->left, minvalue, root) && checkBst(root->right, root, maxvalue));

return(checkBst(root->left, minvalue, root));
return(checkBst(root->right, root, maxvalue));

我的整个程序是这样的

bool checkBst(node *root, node * minvalue, node * maxvalue){
    if(root == NULL){
        return true;
    }
    if((minvalue && root->data <= minvalue->data) || (maxvalue && root->data >= maxvalue->data)){
        return false;
    }
    return(checkBst(root->left, minvalue, root) && checkBst(root->right, root, maxvalue));
    // return(checkBst(root->left, minvalue, root));
    // return(checkBst(root->right, root, maxvalue));
}

坦率地说,您不能为每个函数调用都设置一个 return。这是因为 return 是在将控制权交还给调用函数之前在函数中执行的最后一条语句。

在你的例子中,第二个函数从未被调用。因此,如果您的第一个函数 return 为真,它永远不会调用第二个函数。如果第二个函数结果为假,你得到的答案将是错误的。

您仍然需要在两个语句的末尾都有一个 return 语句,并捕获由函数编辑的 return 值。

我的意思是这个声明:

return(checkBst(root->left, minvalue, root) && checkBst(root->right, root, maxvalue));

等于:

ret1 = checkBst(root->left, minvalue, root);
if(ret1)
    return checkBst(root->right, root, maxvalue);
else
    return false;

递归不是将所有内容都放在一行中。那只是一种编码风格。 Pepijn Kramer 和一些程序员的评论讨论了在同一行中编写代码可以获得的优化。如果前半部分为假,则无需计算后半部分,这样可以节省计算时间和精力。

递归是通过在自身内部调用相同的函数并使用它的结果给出最终结果来完成重复性任务。

在你的情况下,最初你发送整棵树。然后通过为每个子树调用函数将问题分成两半。

在每个函数调用中,您都要处理终止条件。那是您拥有的第一行和第二行。这些是您不调用更多函数的唯一情况。您得到的是 return 值。

现在,这个 return 值应该传播回调用函数