递归 - 暧昧概念

时间:2012-03-08 20:04:14

标签: c# recursion

情景:

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

2 个答案:

答案 0 :(得分:6)

区别在于:

  • 在选项1中,您返回错误的结果
  • 在选项2中,您返回无结果(这是无效的,因此编译错误)。

当然,你也不想要。您想要返回正确的结果:

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