如果我在这里有这个代码块:
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);
}
}
我正在寻找以递归方式编写它的最佳方式。在此先感谢您的指导:)
答案 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)
。