C# 寻找有关递归的快速提示
如果我这里有这个代码块:C# 寻找有关递归的快速提示,c#,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
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);
}
}
void转换(int n)
{
if(n<1)
返回;
其他的
{
测试[i++]=n%2
n=n/2;
转换(n);
}
}
我正在寻找递归编写它的最佳方法。提前感谢您的指导:)我将在回答之前指出,这不是递归的理想候选者,因为这样做并不容易理解。然而,有一种方法可以做到这一点:
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);
}
}
static void Main(字符串[]args)
{
var result=Convert(新列表(),192);
}
静态列表转换(列表位,int n)
{
if(n<1)
{
返回位;
}
其他的
{
位相加(n%2);
返回转换(位,n/2);
}
}
当您可以将正在执行的操作的所有状态作为递归方法参数的一部分来维护时,递归工作得最好。对于这种方法,操作的“状态”包括我们当前试图转换的数字,加上已经转换的位
将位列表与
n
一起传递可以避免在递归函数之外声明数组和迭代器变量。切换到列表
允许我们将下一个位附加到我们迄今为止创建的位的末尾。对于递归方法的初始调用,我们必须通过传递一个空的列表来“播种”状态,我将在回答之前声明,这不是递归的理想候选者,因为这样做不容易理解。然而,有一种方法可以做到这一点:
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);
}
}
int i = 0;
int Convert(int n)
{
if(n < 1) return 0;
else
{
test[i++] = Convert(n/2);
return n % 2;
}
}
static void Main(字符串[]args)
{
var result=Convert(新列表(),192);
}
静态列表转换(列表位,int n)
{
if(n<1)
{
返回位;
}
其他的
{
位相加(n%2);
返回转换(位,n/2);
}
}
当您可以将正在执行的操作的所有状态作为递归方法参数的一部分来维护时,递归工作得最好。对于这种方法,操作的“状态”包括我们当前试图转换的数字,加上已经转换的位
将位列表与n
一起传递可以避免在递归函数之外声明数组和迭代器变量。切换到列表
允许我们将下一个位附加到我们迄今为止创建的位的末尾。对于递归方法的初始调用,我们必须通过传递一个空的列表
inti=0来“种子”状态;
int i = 0;
int Convert(int n)
{
if(n < 1) return 0;
else
{
test[i++] = Convert(n/2);
return n % 2;
}
}
整数转换(整数n)
{
如果(n<1)返回0;
其他的
{
测试[i++]=转换(n/2);
返回n%2;
}
}
希望这能奏效。inti=0;
整数转换(整数n)
{
如果(n<1)返回0;
其他的
{
测试[i++]=转换(n/2);
返回n%2;
}
}
希望这能起作用。您正在尝试获取数组中提供的数字的位。假设数组大小足够:
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);
}
void GetBits(整数编号、整数索引、整数[]位)
{
如果(数字<1)
{
位[索引]=0;
返回;
}
位[索引]=编号%2;
GetBits(数字/2,索引+1,位);
}
将在初始索引为0时调用此方法。例如,GetBits(number,0,bits)
您试图获取数组中提供的数字的位。假设数组大小足够:
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);
}
void GetBits(整数编号、整数索引、整数[]位)
{
如果(数字<1)
{
位[索引]=0;
返回;
}
位[索引]=编号%2;
GetBits(数字/2,索引+1,位);
}
将在初始索引为0时调用此方法。比如,GetBits(number,0,bits)
我认为没有理由递归地这样做。如果您的目标是熟悉递归概念,我建议您看看Haskell语言。它很容易进入,并且暴露了很多与递归相关的东西;“向您学习Haskell for Great Good”是一个非常好的初学者指南。您可以返回test[]作为该方法的结果。@DiligentKeyPresser-您是对的,先生,我想熟悉递归。我也不打算递归地编写示例代码。谢谢你的例子,因为我没听说过。爱大象:)我看不出有什么理由重复这样做。如果您的目标是熟悉递归概念,我建议您看看Haskell语言。它很容易进入,并且暴露了很多与递归相关的东西;“向您学习Haskell for Great Good”是一个非常好的初学者指南。您可以返回test[]作为该方法的结果。@DiligentKeyPresser-您是对的,先生,我想熟悉递归。我也不打算递归地编写示例代码。谢谢你的例子,因为我没听说过。爱大象:)谢谢你的快速解释!多亏了DiligentKeyPresser,我找到了一本有用的书——《学好哈斯克尔》。从第一次看它和阅读一些评论,它似乎是一个体面的介绍函数式编程。感谢您的快速解释北京!多亏了DiligentKeyPresser,我找到了一本有用的书——《学好哈斯克尔》。从第一次看它和阅读一些评论,它似乎是一个体面的介绍函数式编程。