我创建一个随机数,然后检查它是否存在于数据库表中.如果确实如此,我会生成另一个并再次检查,以下工作会是什么?
public int GenerateNumber()
{
Random r = new Random();
int num = r.Next(1000);
//Psuedo-code
if(num is in table)
GenerateNumber();
return num;
}
Run Code Online (Sandbox Code Playgroud)
似乎基于下面的答案,这里应该避免递归,我应该自动增加数字,所以一个好的选择是在1处开始自动增量,在0处填充,直到8个字符长或从10,000,000.
此外,如果数据类型必须是varchar(8),该怎么办?如何自动递增数字,但是将其存储在varchar(8)中?
你的方法存在很多问题已被其他人解决,所以相反我会回答你应该问的问题,但不会:
为了正确使用递归,问题必须具有哪些特征?
你不能使用递归,除非您的解决方案表现出所有的以下特征:
您的示例代码没有展示这些特征; 使用递归需要您展示所有这些特性,因此在任何情况下都不应使用递归.
让我给你的问题的一个例子是很好用递归解决:
树是空的或由左右子树组成; 树永远不会包含循环.空树的高度为零; 非空树的高度是从根到"最深"空子树的最长路径的长度.假设高度小于200,编写一个确定树高的方法.
这个问题展示了可以通过递归解决的问题的所有特征,因此我们可以这样做.每个递归程序都有这样的模式:
所以我们这样做:
int Height(Tree tree)
{
// Trivial case:
if (tree.IsEmpty) return 0;
// Non-trivial case: reduce the problem to two smaller problems:
int leftHeight = Height(tree.Left);
int rightHeight = Height(tree.Right);
int height = Math.Max(leftHeight, rightHeight) + 1;
return height;
}
Run Code Online (Sandbox Code Playgroud)
这不是需要通过递归解决的问题.更不用说如果你的数据库中有一些数字很多,而且循环很多次,你很快就会出现堆栈溢出错误.为什么不将其更改为迭代函数:
public int GenerateNumber()
{
Random r = new Randon();
int num = r.Next(1000);
while(num is in database)
{
num = r.Next(1000);
}
return num;
}
Run Code Online (Sandbox Code Playgroud)
一种不同的方法,而我在这里
为什么不在这些值之间实现一些传递差异?即:第一个数字是一个,然后是两个等等.然后您需要做的就是获取最新的条目,并添加一个.无需始终如一地进行数据库查询.
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |