寻找关于递归的快速提示

时间:2016-03-09 04:59:37

标签: c#

如果我在这里有这个代码块:

int n = 29; //or any number
    int i;
    int[] test = new int[100];
            while(n > 0 )
            {
              test[i++] = n % 2;
                n = n/2;
            }

我想让它递归,我从头顶想到的是非常蹩脚。

void Convert(int n)
{
   if(n < 1 )
     return;                  

   else
   {
      test[i++] = n % 2
      n = n/2;
      Convert(n);
   }   
}

我正在寻找以递归方式编写它的最佳方式。在此先感谢您的指导:)

3 个答案:

答案 0 :(得分:2)

我将通过声明这不是递归的理想候选人来作为我的答案的前言,因为当这样做时,它并不容易理解。不过,这是一种方法:

static void Main(string[] args)
{
    var result = Convert(new List<int>(), 192);
}

static List<int> Convert(List<int> bits, int n)
{
    if (n < 1)
    {
        return bits;
    }
    else
    {
        bits.Add(n % 2);
        return Convert(bits, n / 2);
    }
}

当您可以维护作为递归方法参数的一部分执行的操作的所有状态时,递归最有效。对于这种方法,&#34;状态&#34;该操作包括我们当前尝试转换的数字,以及已经转换的位数。

将位列表与n一起传递可以防止需要在递归函数之外声明数组和迭代器变量。切换到List允许我们将下一位附加到我们到目前为止创建的位的末尾。对于递归方法的初始调用,我们必须&#34; seed&#34;传入空List

答案 1 :(得分:0)

int i = 0;

int Convert(int n)
{
    if(n < 1) return 0;
    else
    {
        test[i++] = Convert(n/2);
        return n % 2;
    }
}

希望这有效。

答案 2 :(得分:0)

您正在尝试获取数组中提供的数字的位。假设数组足够大:

void GetBits(int number, int index, int[] bits)
{
   if (number < 1 )
   {
       bits[index] = 0;
       return;
   }        
   bits[index] = number % 2;
   GetBits(number / 2, index + 1, bits);   
}

将使用初始索引= 0调用此方法。例如,GetBits(number, 0, bits)