【问题标题】:executing a statement in a specific recursive call in c++在 C++ 中的特定递归调用中执行语句
【发布时间】:2019-03-20 17:44:19
【问题描述】:

我在 c++ 中创建了一个递归函数,我希望在执行所有递归调用后,当我返回到函数的第一个递归调用时,然后只执行函数内部的特定语句。基本上,我想要一些机制,通过它我可以只执行一次语句,但是当控件返回到第一个递归调用时。我尝试了静态,但它实际上为所有递归函数创建了一个副本,因此每次控件在我的代码中遇到该特定行时,它都会被更改,我不希望这样。我想要一次,但是当控件返回到第一个递归调用时。

是否有任何关键字或机制来处理这种行为,或者我只能通过一些条件逻辑来做到这一点?

【问题讨论】:

  • 查看您的代码将帮助我们更好地帮助您
  • 我不认为这是一个骗局,因为这只是一个解决方案。不幸的是,这个问题太宽泛了,但这个答案肯定不会涵盖所有问题。

标签: c++ recursion


【解决方案1】:

为什么不直接

void real_recursive_call() {
    // do recursive work
}

void recursive_call() {
    real_recursive_call();
    do_something();
}

int main() {
    recursive_call();
}

【讨论】:

  • 对于同样的工作,我不想添加额外的函数,因为这为我所有的递归函数添加了 2 个函数,我的代码变得混乱,甚至在某种程度上失去了可读性。
  • 具有递归算法的“启动”功能是很常见的。
  • 拥有一个“启动”函数还可以让你保持公共表面函数不受你传递的任何状态的影响,这意味着调用者不需要知道那个状态是什么。
【解决方案2】:

这个呢:

void Plus(int Val, bool bFirstCall = true)
{
    // Show the current depth for debugging purposes:
    std::cout << "current val: " << Val << std::endl;

    // Increase the depth and call the recursive function with bFirstCall == false explicitly
    if (++Val < 100) Plus(Val, false);

    if (bFirstCall)
    {
        std::cout << "This is the first call" << std::endl;
    }
}

您可以通过将递归方法设为私有并使用公共方法调用 bFirstCall = true 来使其更优雅。

【讨论】:

  • 如果由于某种原因,Plus() 的第一次调用被第二个参数false 调用,这将中断。没有什么可以阻止的。
  • 另外,由于每次调用的堆栈都必须更大,这不会增加递归调用的成本吗?
  • 没有额外的参数,因为我不想编辑调用,但是如果在正文中使用变量会更好
【解决方案3】:

快速回答:

template <typename T>
int BST<T>::getMaxHeight() const
{
    // This function should return the maximum height of the BST
    struct
    {
        int operator()(BSTnode *bst) const
        {
            if (bst == NULL)
                return 0;
            return 1 + max((*this)(bst->left.root), (*this)(bst->right.root));
        }

    } func;
    return (func(root));
}

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 2013-04-25
    • 2020-10-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多