为什么将十进制转换为二进制的递归方法比迭代、使用和返回字符串更快
Why would the recursive method of converting decimal to binary be faster than the iterative, using and returning strings?
我创建了两个接受十进制数并返回该数字的二进制表示形式的函数。我选择了一种简单的方法来做到这一点,在经过一些简单的数学运算后,将 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'
在函数末尾连接和反转所有字符串。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C 字符串返回字符串的整数/双精度/长整型值
- 如何从COM模块中的函数返回字符串数组?
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 我如何在函数 cpp 中返回字符串
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 格式化返回字符串C++
- 返回字符串vs通过引用传递字符串以更新值
- 如何在不使用 STL 的情况下从函数反转字符串后返回字符串C++?
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- 从 C++ 中的模板函数返回字符串和整数
- 返回字符串的散点回文计数
- C++重载字符串 [] 运算符以返回字符串和
- 返回字符串和不同向量数据类型的映射C++
- 字符串函数不返回字符串? C++
- 从函数返回字符串C++错误
- 如何在返回字符串的函数中不忽略void值
- 我想将字符串转换为 Json 格式并返回字符串向量作为答案
- C - 返回字符串时的分割故障
- 使用向量和字符串函数返回字符串