关于函数参数和递归的类和默认值的 C++ 问题

标签 c++ visual-c++ recursion count

我需要使用递归来计算链表中的节点。

unsigned CLL::CountNodes(CNode* val)
{
    if(!val)
        return 0;
    else
        return 1 + CountNodes(val->next);
}

所以当我想从另一个函数计算链表中的节点时,我会去:

int main()
{
    CLL list();
    cout << list.CountNodes(list.head);
}

虽然这看起来有点狡猾,因为类应该能够计算列表,而无需我将一个点传递给列表的头部。这看起来很简单,有一个 for 循环;然而,通过递归,我尝试了:

unsigned CLL::CountNodes(CNode* val = head)
{
    if(!val)
        return 0;
    else
        return 1 + CountNodes(val->next);
}

但这没有用,因为 head 不是静态的。然后使 head 静态是一个问题,因为我必须在类之外声明它。

有没有办法解决这个问题? 例如cout << list.CountNodes(); 或者在使用递归时必须始终传入列表的头部?

最佳答案

在 C++ 中总有办法。你可能有两个 overloaded functions ,例如:

unsigned CountNodes (CNode* val)
{
    return val ? CountNodes(val->next) + 1 : 0;
}

unsigned CountNodes ()
{
    return CountNodes (head);
}

我还建议制作 unsigned CountNodes (CNode* val) 函数 static因为它不需要 CLL 类和 unsigned CountNodes () method constant 中的任何内容因为它不会改变对象的状态。

顺便说一句,有一个ternary operator在 C++ 中,它使生活更轻松,代码更具可读性,甚至可能使其更快。所以不是:

if(!val)
        return 0;
    else
        return 1 + CountNodes(val->next);

...你可以这样写:

return val ? 1 + CountNodes(val->next) : 0;

关于关于函数参数和递归的类和默认值的 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7577877/

相关文章:

c++ - 在 buildbot 上构建后,Qt 应用程序变为 Windows 旧样式

c++ - 从 docker image build 中省略设置文件

xml - XSLT:基于 2 个子元素的元素的数学加法

c++ - 在构造时初始化一个 float 组

c++ - 输出 cout 是感叹号。 C++

c++ - OpenGL 多视口(viewport)和 gluPerspective()

visual-studio - 支持 SSE2 的 Visual Studio 6 处理器包

winforms - 在 VC++ 中使用 'VS2010 Parallel Patterns Library'

c++ - BST 递归解决方案中的第 K 个最小元素

android - 为什么解析 StackOverflowException 会抛出 OOM?