递归检查数据库中的重复随机数

Xai*_*oft -2 c#

我创建一个随机数,然后检查它是否存在于数据库表中.如果确实如此,我会生成另一个并再次检查,以下工作会是什么?

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)中?

Eri*_*ert 6

你的方法存在很多问题已被其他人解决,所以相反我会回答你应该问的问题,但不会:

为了正确使用递归,问题必须具有哪些特征?

不能使用递归,除非您的解决方案表现出所有的以下特征:

  • 有一个"琐碎"的问题版本,总是可以在没有递归的情况下解决.
  • 每个非平凡的问题都可以减少到一个或多个严格的小问题.
  • 将问题重复地减少到较小的问题最终导致尝试在少量步骤之后解决一个微不足道的问题,其中"小"意味着,例如,几百步,而不是几百万步.(这种情况可以在"尾递归"语言中放宽; C#不是尾部重复语言.)
  • 解决较小问题的解决方案总能有效地组合成解决更大问题的解决方案.

您的示例代码没有展示这些特征; 使用递归需要您展示所有这些特性,因此在任何情况下都不应使用递归.

让我给你的问题的一个例子很好用递归解决:

树是空的或由左右子树组成; 树永远不会包含循环.空树的高度为零; 非空树的高度是从根到"最深"空子树的最长路径的长度.假设高度小于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)


chr*_*her 5

这不是需要通过递归解决的问题.更不用说如果你的数据库中有一些数字很多,而且循环很多次,你很快就会出现堆栈溢出错误.为什么不将其更改为迭代函数:

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)

一种不同的方法,而我在这里

为什么不在这些值之间实现一些传递差异?即:第一个数字是一个,然后是两个等等.然后您需要做的就是获取最新的条目,并添加一个.无需始终如一地进行数据库查询.