递归函数迭代到下一个节点与递归函数调用的区别



在这段代码中,我比较了两个链表,并检查链表中的项是否相等。

bool Check(Node *listA, Node *listB) {
if (listA == NULL && listB == NULL)
return true;
if (listA->item == listB->item)
{
listA = listA->link;
listB = listB->link;
return Check(listA, listB);
}
return false;
}

我想知道这段代码之间的区别:

listA = listA->link;
listB = listB->link;
return Check(listA, listB);

,这是:

return Check(listA->link, listB->link);

这两段代码都产生了正确的答案,但我似乎不明白它们有什么区别。

没有区别,它们做的是完全一样的事情。唯一的区别是,如果需要,可以在下一个节点中更改一些内容,然后再调用Check()。但在你的情况下,它们是完全相同的,第二个选项更干净,所以我推荐那个。

一般来说,修改In参数值会使函数的代码和意图变得不那么清晰,所以最好避免这样做。

还要考虑,如果您正在使用调试器并退回到先前的递归调用,您将无法看到检查的正确节点,因为它的指针已经被覆盖。这样调试起来会更混乱。

实际上,两个函数的结果是相同的。由于跳过了两个无意义的赋值操作,第二种方法可能会快得多,除非它被优化掉了。

最新更新