2013-04-09 41 views
1

我在试图弄清楚如何跟踪递归函数在执行collat​​z函数时调用自身的次数。我有函数定义:在我的递归函数(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/

+3

将count作为参数传递,或使其成为静态。 – Serdalis 2013-04-09 02:45:33

+1

@Serdalis在递归函数中不能使用静态变量?变量永远不会被重置,并且在任何时候都无法将其设置为零,因为每次调用自身时都会重复将其设置为零。 – 2013-04-09 02:46:56

+0

@ Need4Sleep您从未提及任何关于多个初始条目的任何内容,并且在这种情况下,静态会正常工作。否则,请使用by-reference count参数。 – WhozCraig 2013-04-09 02:48:44

回答

2

您正试图计算在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); 
    } 
} 
+0

正是我在找的东西,当你的答案弹出时,我只是想着这个。现在有道理,谢谢! – 2013-04-09 02:55:15

+1

没问题...因为我预测你现在要尝试计算起始值小于1,000,000的最长Collat​​z链,所以我建议你通过提供一个'vector'参考来记忆这些调用。 ;-) – paddy 2013-04-09 02:59:14