场景:
比方说,我有两个功能.
第一个功能涉及读取单个位,从而返回真或假.
第二个功能涉及使用第一个函数读取可变数量的位n次,其中n是位数.
第一功能:
private bool ReadBit ( )
{
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
第二个功能:(递归是在这里使用而不是循环迭代众所周知的技术)
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
}
}
Run Code Online (Sandbox Code Playgroud)
我知道OPTION 2会抛出一个错误," 并非所有代码路径都返回一个值 ".
这不是问题,因为我可以通过多种方式欺骗编译器!
我的问题:
选项1和选项2之间的真正区别是什么?
我发誓,如果我们在OPTION 2的某个地方添加一个返回行并稍微重新排序行,我们都会做递归概念.
区别在于:
当然,你也不想要.您想要返回正确的结果:
Result.Add(ReadBit());
Result.AddRange(ReadBits(value - 1));
return Result;
Run Code Online (Sandbox Code Playgroud)
也就是说,首先添加当前读取的位,然后追加所有下一个读取位(递归创建).
然而,这非常低效.它更有效地扭转的过程中,从而创造只有单一的列表.
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;
}
Run Code Online (Sandbox Code Playgroud)
但请注意,这当然会颠倒结果列表的顺序.
就像我喜欢递归一样,为什么不采用迭代方法,可以在C#中更自然地表达?