如何计数递归的次数?(计算X^n的乘法数)
How to count number of times recursion is called? (Computing number of multiplications for x^n)
我在弄清楚如何增加计数(在我的代码中(时遇到了一些困难,以至于power2的计数器等同于power1。我的程序以不同方式比较计算X^n的效率。我查找了有关如何计算递归呼唤次数的解决方案,但是无论我实现哪种方法,都会获得不正确的输出。任何帮助或准则将不胜感激!
这是我到目前为止我代码的一部分(Power1具有正确的计数器(:
template <class T>
T power1(T x, unsigned int n, unsigned int& mults)
{
mults = 0;
if (n == 0)
return 1;
else if (n == 1)
return x;
else
{
T total = 1;
for (int i = 0; i < n; ++i)
{
total = total * x;
++mults;
}
mults -= 1;
return total;
}
}
template <class T>
T power2(T x, unsigned int n, unsigned int& mults)
{
++mults;
if (n == 0)
{
mults = 0;
return 1;
}
else if (n == 1)
return x;
else
{
if (n > 1)
{
return (x * power2(x, n - 1, mults));
}
}
return x;
}
这是我输出的一部分:
Test for integer base:
2^0 = 1: mults1 = 0, mults2 = 0
2^1 = 2: mults1 = 0, mults2 = 1
2^2 = 4: mults1 = 1, mults2 = 3
2^3 = 8: mults1 = 2, mults2 = 6
2^4 = 16: mults1 = 3, mults2 = 10
2^5 = 32: mults1 = 4, mults2 = 15
2^6 = 64: mults1 = 5, mults2 = 21
2^7 = 128: mults1 = 6, mults2 = 28
2^8 = 256: mults1 = 7, mults2 = 36
2^9 = 512: mults1 = 8, mults2 = 45
您需要在呼叫之间重置MULTS2。
简单的解决方案是
power2(2,2,foo);
//reset before next call
foo=0;
power2(2,3,foo);
,也可以使函数自动重置。
template <class T>
T power2(T x, unsigned int n, unsigned int& mults, bool init = true)
{
if (init)
mults=0;
if (n == 0)
{
mults = 0;
return 1;
}
else if (n == 1)
return x;
else
{
if (n > 1)
{
++mults;
return (x * power2(x, n - 1, mults, false));
}
}
return x;
}
我认为这里有两个问题:您在每个呼叫power2之前都不会重置多个问题,而您在开始时就会增加。这给出了正确的结果:
#include <iostream>
using namespace std;
template <class T>
T power2(T x, unsigned int n, unsigned int& mults)
{
if (n == 0)
{
mults = 0;
return 1;
}
else if (n == 1)
return x;
else
{
if (n > 1)
{
return (x * power2(x, n - 1, ++mults));
}
}
}
int main() {
int x = 2;
int n = 4;
unsigned int mults = 0;
int res = power2(x, n, mults);
std::cout << x << "^" << n << " = " << res << " - mults: " << mults << "n";
x = 2;
n = 5;
mults = 0;
res = power2(2, 5, mults);
std::cout << x << "^" << n << " = " << res << " - mults: " << mults << "n";
return 0;
}
输出:
2^4 = 16 - mults: 3
2^5 = 32 - mults: 4
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 如何计数递归的次数?(计算X^n的乘法数)
- 递归函数内的计数
- 通过递归计数整数中的数字数量
- Qt vs Boost 文件系统递归文件计数
- 找到用户输入的每个4位数字,并使用递归进行计数
- 使用递归函数的长度字符计数
- 如何在递归函数中计数
- 基例如何影响使用递归函数的哪些行
- 递归方法计数上下,奇数和偶数