我目前正试图绕过递归,所以我选择了一本c ++教科书并开始阅读。关于递归的章节中的前几页很容易理解,但后来我找到了一个对我没有意义的项目。
int height(node *p)
{
if(p==NULL)
return 0;
else{
return 1 + max(height(p->llink),height(p->rlink));
}
如果max给出了两个值中最大的值,那么max如何从它返回的高度获得它的参数。 如果有人可以提供帮助,我会非常感激..... ...
答案 0 :(得分:6)
要理解递归,你必须递归思考:
从此开始,您可以轻松理解代码。如果你画树,你会看到会发生什么。如果你有例如
A
/ \
B C
/ \
D E
height(A)
将返回1 + max(height(B), height(C))
height(B)
将返回1 + max(height(D), height(E))
height(C)
将返回1 + max(height(NULL), height(NULL)) = 1
height(D)
将返回1 + max(height(NULL), height(NULL)) = 1
height(E)
将返回1 + max(height(NULL), height(NULL)) = 1
所以
height(A) = 1 + max(height(B), height(C)) =
= 1 + max(1 + max(height(D),height(E)), 1) =
= 1 + max(1 + 1, 1) = 1 + max(2, 1) = 3
(我省略了对height(NULL)
的调用,因为它们通常为0,否则会过于冗长。)
答案 1 :(得分:2)
在函数调用之前计算函数的参数。
所以你的等效示例可能如下所示(这可能更有意义吗?):
int height(node *p)
{
if(p==NULL)
return 0;
else{
int heightLeftSubtree = height(p->llink);
int heightRightSubtree = height(p->rlink);
return 1 + max(heightLeftSubtree, heightRightSubtree);
}
}