有什么區別
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));
}
uj5u.com熱心網友回復:
坦率地說,您不能為每個函式呼叫都回傳。這是因為 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 和一些程式員的評論討論了在同一行中撰寫代碼可以獲得的優化。如果第一半為假,則不需要評估第二半,這樣可以節省計算時間和精力。
遞回是關于通過在自身內部呼叫相同的函式并使用它的結果給出最終結果來執行重復性任務。
在您的情況下,最初您發送整棵樹。然后通過為每個子樹呼叫函式將問題分成兩部分。
在每個函式呼叫中,您都會處理終端條件。這是您擁有的第一行和第二行。這些是您不呼叫更多函式的唯一情況。您正在獲得回傳值。
現在,這個回傳值應該傳播回呼叫函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/391151.html
