因此,我的教授希望我们为此类“ addressBookType”类的链表设计递归函数,该类源自其他4个类。该程序基本上会创建一个包含该人的姓名,地址,日期和关系的地址簿,每个地址簿都有自己的类。
她要执行的递归功能是打印,追加,删除和顺序搜索。
但这是问题所在。递归函数的主要前提是它应该在函数定义中调用自身,对吗?我成功制作了递归追加函数,但是递归打印函数遇到了麻烦。
原始打印功能和递归打印功能如下:
void addressBookType::displayList() const
{
ListNode *nodePtr; // To move through list
nodePtr = head; // start at the head of list
while(nodePtr != NULL) // while nodePtr points to a node, move through list
{
displayListRecursive(nodePtr);
nodePtr = nodePtr->next;
}
}
void addressBookType::displayListRecursive(ListNode *node) const
{
if(node != NULL)
{
(node->value).print();
displayListRecursive(node->next);
}
}
我遇到的麻烦是,当我运行程序时,所有内容都会打印,然后在第二个对象上开始打印,直到剩下一个对象为止。这是我打印时的意思:
1
2
3
4
2
3
4
3
4
4
我会粘贴实际输出,但是它非常冗长,因为每个对象都显示该人的名字,姓氏,地址,街道,邮政编码,城市,州,日期和关系类型。
每当我在displayListRecursive函数中取出displayListRecursive(node->next)
时,一切都可以正常打印。但这不是真正的递归函数吗?还是?任何人都有可以解释这一点的答案? (我真的是递归的新手)
答案 0 :(得分:1)
我认为递归定义很好。它将打印您提供的节点,然后调用下一个直到其NULL
。
因此,您只需要从第一个节点调用递归函数即可。
问题是您正在displayList
的while循环中的所有节点上多次调用它。
我认为,如果只删除while循环,它应该会按预期工作。
类似这样的东西:
void addressBookType::displayList() const
{
displayListRecursive(head);
}
void addressBookType::displayListRecursive(ListNode *node) const
{
if(node != NULL)
{
(node->value).print();
displayListRecursive(node->next);
}
}