递归 - 暧昧概念

Ahm*_*eim -1 c# recursion

场景:

比方说,我有两个功能.
第一个功能涉及读取单个位,从而返回真或假.
第二个功能涉及使用第一个函数读取可变数量的位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的某个地方添加一个返回行并稍微重新排序行,我们都会做递归概念.

Kon*_*lph 6

区别在于:

  • 在选项1中,您返回错误的结果.
  • 在选项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#中更自然地表达?