情景:
比方说,我有两个功能 第一个功能涉及读取一个比特,从而恢复真或假 第二个功能涉及使用第一个函数读取可变数量的位n次,其中n是位数。
第一个功能:
private bool ReadBit ( )
{
.
.
.
}
第二功能:(递归就是在这里使用而不是循环迭代众所周知的技术)
public List<bool> ReadBits ( int Value ) //Value = Number of Bits
{
List<bool> Result = new List<bool> ( );
if ( Value == 0 )
{
return Result;
}
else
{
Result . Add ( ReadBit ( ) );
return ReadBits ( --Value ); //OPTION 1
ReadBits ( --Value ); //OPTION 2
}
}
我知道OPTION 2会抛出一个关于“并非所有代码路径返回值”的错误。
这不是问题,因为我可以通过多种方式欺骗编译器!
我的问题:
OPTION 1&amp; S之间有什么真正的差别?选项2?
我发誓,如果我们在OPTION 2&amp ;;的某处添加一条返回线,我们都会做递归概念。稍微重新排序。
答案 0 :(得分:6)
区别在于:
当然,你也不想要。您想要返回正确的结果:
Result.Add(ReadBit());
Result.AddRange(ReadBits(value - 1));
return Result;
也就是说,首先添加当前读取的位,然后追加所有下一个读取位(递归创建)。
然而,这非常低效。 反向过程效率更高,因此只创建单个列表。
public List<bool> ReadBits(int Value)
{
if (Value == 0)
{
List<bool> Result = new List<bool>();
}
else
{
List<bool> Result = ReadBits(value - 1);
Result.Add(ReadBit());
}
return Result;
}
但请注意,这当然会颠倒结果列表的顺序。
就像我喜欢递归一样,为什么不采用迭代方法,可以在C#中更自然地表达?
答案 1 :(得分:1)
为什么不采用更简单的方法,例如:
public List<bool> ReadBits(int value)
{
List<bool> result = new List<bool>();
while(value > 0)
{
result.Add(value & 1 == 1);
value /= 2;
}
return result;
}
修改:我的上述解决方案假设您希望将对象的实际二进制表示形式设为List
bools
。