【问题标题】:Keeping track of count in my recursive function(Collatz)在我的递归函数中跟踪计数(Collat​​z)
【发布时间】:2013-04-09 02:44:03
【问题描述】:

我在尝试弄清楚如何跟踪我的递归函数在执行 collat​​z 函数时调用自身的次数时遇到了麻烦。我有函数定义:

template<class myType>
myType recursionSet<myType>::collatz(myType n)
{
    if(n == 1)
        return 1;
    else {
        if(n%2 == 1)
            return collatz(3*n+1);
        else
            return collatz(n/2);
    }
}

我怎样才能跟踪这个函数调用自身的次数?我似乎无法为我的生活想出一个解决方案。谢谢!

引用 collat​​z 函数:http://www.xamuel.com/collatz-recursion/

【问题讨论】:

  • 将计数作为参数传入,或将其设为静态。
  • @Serdalis 递归函数中的静态变量不起作用?该变量永远不会被重置,也无法在任何时候将其设置为零,因为它每次调用自己时都会重复将自己设置为零。
  • @Need4Sleep 你只提到了一个初始条目,在这种情况下,静态将正常工作。否则使用按引用计数参数。
  • 是的,我认为静态会有问题。将它作为参数传递是你想要的。
  • 是的,静态会有问题,因为你也必须有一个案例来重置它,只需提供选项:)

标签: c++ recursion collatz


【解决方案1】:

您正在尝试计算 Collat​​z 链的长度,不是吗。您是否意识到目前您总是返回1?您应该修改代码以返回计数。这意味着将当前迭代添加到递归调用中:

template<class myType>
myType recursionSet<myType>::collatz(myType n)
{
    if(n == 1)
        return 1;
    else {
        if(n%2 == 1)
            return 1 + collatz(3*n+1);
        else
            return 1 + collatz(n/2);
    }
}

【讨论】:

  • 正是我想要的,当你的答案出现时,我只是在想这个。现在明白了,谢谢!
  • 没问题...因为我预测您现在将尝试计算起始值小于 1,000,000 的最长 Collat​​z 链,我建议您通过提供 vector 来记忆调用参考。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
相关资源
最近更新 更多