有什么区别
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 是在将控制权交还给调用函数之前函数中执行的最后一条语句。
就您而言,第二个函数永远不会被调用。因此,如果您的第一个函数返回 true,它永远不会调用第二个函数。如果第二个函数结果为假,您得到的答案将是错误的。
您仍然需要在两个语句末尾都有一个 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 和一些程序员的评论谈论了通过在同一行中编写可以获得的优化。如果前半部分为假,则无需计算后半部分,这样可以节省计算时间和精力。
递归是通过在自身内部调用相同的函数并使用其结果给出最终结果来执行重复任务。
就您而言,最初您发送整棵树。然后,通过调用每个子树的函数,将问题分为两半。
在每个函数调用中,您都要处理终端条件。这是您拥有的第一行和第二行。这些是您不调用更多函数的唯一情况。您将获得一个返回值。
现在,这个返回值应该被传播回调用函数
关于c++ - C++中的递归函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70458373/