C++ 如何计算调用递归的次数?(计算x^n的乘法数)

C++ 如何计算调用递归的次数?(计算x^n的乘法数),c++,c++11,C++,C++11,我在计算如何以power2的计数器与power1的计数器相等的方式递增计数(代码中的mults)时遇到了一些问题。我的程序比较了不同方式计算x^n的效率。我查找了有关如何计算递归调用自身次数的解决方案,但无论实现什么方法,我都会得到错误的输出。任何帮助或指导都将不胜感激 这是我目前代码的一部分(power1有正确的计数器): 您需要在两次调用之间重置mults2 简单的解决办法是 power2(2,2,foo); //reset before next call foo=0; power2(2

我在计算如何以power2的计数器与power1的计数器相等的方式递增计数(代码中的mults)时遇到了一些问题。我的程序比较了不同方式计算x^n的效率。我查找了有关如何计算递归调用自身次数的解决方案,但无论实现什么方法,我都会得到错误的输出。任何帮助或指导都将不胜感激

这是我目前代码的一部分(power1有正确的计数器):


您需要在两次调用之间重置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;
}
模板
T power2(tx,unsigned int n,unsigned int&mults,bool init=true)
{
if(init)
mults=0;
如果(n==0)
{
mults=0;
返回1;
}
else如果(n==1)
返回x;
其他的
{
如果(n>1)
{
++骡子;
返回(x*power2(x,n-1,mults,false));
}
}
返回x;
}

您需要在调用之间重置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;
}
模板
T power2(tx,unsigned int n,unsigned int&mults,bool init=true)
{
if(init)
mults=0;
如果(n==0)
{
mults=0;
返回1;
}
else如果(n==1)
返回x;
其他的
{
如果(n>1)
{
++骡子;
返回(x*power2(x,n-1,mults,false));
}
}
返回x;
}

我认为这里有两个问题:您没有在每次调用power2之前重置mults,而是在开始时递增。这将给出正确的结果:

#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;
}

我认为这里有两个问题:在每次调用power2之前没有重置mults,并且在开始时递增。这将给出正确的结果:

#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;
}

如果要计算乘法的数量,请仅在实际执行乘法时增加
mults
。@interjay I put mults++;就在递归语句之前,但我仍然得到相同的数字,除了在2^1处得到0。有没有其他方法可以增加mult?是要计算递归数还是乘法数?您的问题标题和描述似乎相互矛盾。您是否在两次调用之间将mults2重置为0?@JustinRandall抱歉,我需要乘法数-我认为乘法数等于递归数如果您要计算乘法数,只有在实际执行乘法运算时才增加
mults
。@interjay我把mults++放进去;就在递归语句之前,但我仍然得到相同的数字,除了在2^1处得到0。有没有其他方法可以增加mult?是要计算递归数还是乘法数?您的问题标题和描述似乎相互矛盾。您是否在调用之间将mults2重置为0?@JustinRandall抱歉,我需要乘法的数量-我以为乘法的数量等于递归的数量哇,我甚至没有想到使用布尔值,但这非常有效。非常感谢。哇,我甚至没有想过使用布尔值,但这非常有效。非常感谢。