gpt4 book ai didi

c - 在递归调用自身的函数中省略 "return"语句

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:21 25 4
gpt4 key购买 nike

<分区>

typedef struct s_node {
int val;
struct s_node *left_child;
struct s_node *right_child;
} NODE;

NODE *get_node_by_val(NODE *root, int searched_val) {
if (root != NULL) {
if (root->val == searched_val)
return root;
else if (root->val > searched_val)
get_node_by_val(root->left_child, searched_val); /**/
else if (root->val < searched_val)
get_node_by_val(root->right_child, searched_val); /**/
} else
return root;
}

今天我们讨论的是二叉搜索树。 get_node_by_val 在这样的树中搜索 NODE,其 val 与给定的 searched_val 匹配。递归地。

争论的焦点是第 12 和 14 行,用 /**/ 标记。

乍一看,或者至少在我看来,它们都应该在 return 语句之前。如果没有 return 语句,我的猜测是确实搜索了子树,但没有对其返回的值进行任何处理。在某些时候,某些对 get_node_by_val 的调用将返回(NULL 或指向匹配节点的指针),并且该值将传递给调用者,但这可能会发生递归级别向下,其中调用者必须将此值传递回其调用者,依此类推,一直到第一个调用者。但是如果没有 return 语句,只有“紧接在”返回者之上的调用者才能获取该信息。

或者这是我的猜测。

问题是这段代码有效(今天早些时候在类里面发生过,还没有在家里再次尝试过)。

为什么?怎么办?

我没有根据的猜测如下:最深的递归调用,即返回的调用,将其返回值放在 EAX 上。它上面的所有调用都不会返回任何东西——让 EAX 一直保持不变,直到第一个调用者返回(不返回任何东西)。最后,调用者(第一次调用 get_nove_by_val 的调用者)看到 EAX 仍然包含最深调用放在那里的值,并认为它也可能是第一次调用的值可能已经返回,所以一切正常。

是这样吗?这是不好的做法吗?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com