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

Why would the recursive method of converting decimal to binary be faster than the iterative, using and returning strings?

本文关键字:返回 字符串 迭代 转换 十进制 二进制 递归方法 为什么      更新时间:2023-10-16

我创建了两个接受十进制数并返回该数字的二进制表示形式的函数。我选择了一种简单的方法来做到这一点,在经过一些简单的数学运算后,将 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';
        }
    }
}

将字符附加到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());

时间应该几乎相同,或者迭代应该变得稍微快一些。

唯一可疑的部分是如何将字符串连接在一起:

ss = ss + '1';  // 1
ss = '1' + ss;  // 2

第一个(就像递归方法一样)有机会不移动所有字符,而只是在字符串末尾添加一个字符。

但是第二个必须将所有字符向右移动(甚至创建一个新字符串)。

若要解决此问题,请使用 ss += 'x' 在函数末尾连接和反转所有字符串。