为什么将十进制转换为二进制的递归方法比迭代,使用和返回字符串更快?

the*_*key 4 c++ iteration recursion time

我创建了两个接受十进制数的函数,并返回该数字的二进制表示.我选择了一种简单的方法,通过在一些简单的数学运算之后将1和0连接到一个字符串.我创建了一个迭代和递归方法来执行此操作.然后我用老师给我的计时器课程计时两种方法.事实证明,与我的迭代方法相比,我的递归方法速度快了两倍.为什么会这样呢?

string CConversion::decimalToBinaryIterative(int num)
{
   string ss;
   while(num > 0)
   {
        if  (num%2 != 0)
        {
            ss = '1' + ss;
        }
        else
        {
            ss = '0' + ss;
        }
        num=num/2;
    }
    return ss;
}
string CConversion::decimalToBinaryRecursive(int num)
{
    if(num <= 0)
    { 
        return "";
    } 
    else 
    {
       if  (num%2 != 0)
       {
            return decimalToBinaryRecursive(num/2) + '1';
       }
        else
        {
            return  decimalToBinaryRecursive(num/2) + '0';
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

将字符附加到a std::string比预先挂起的字符便宜,因为如果字符串的容量允许,则可以在不复制字符串的情况下完成附加.

但是,前置总是需要整个字符串的副本.

如果您将迭代代码更改为此

string ss;
while(num > 0)
{
    if  (num%2 != 0)
    {
        ss = ss + '1';
    }
    else
    {
        ss = ss + '0';
    }
    num=num/2;
 }
 return string(ss.rbegin(), ss.rend());
Run Code Online (Sandbox Code Playgroud)

时间应该几乎相同,否则迭代应该变得更快.