【问题标题】:Is this recursive function correct?这个递归函数正确吗?
【发布时间】:2012-12-19 18:21:32
【问题描述】:

我开发了这个使用递归调用自身的函数。我需要生成一个唯一的激活码。

它是这样的: 1. 使用单独类文件中的函数生成随机字符串。 (见第二个代码) 2. 我正在检查激活表中该字符串的唯一性,以便没有重复项。 3.万一如果重新生成随机字符串虽然我知道机会很小,但我不想冒险。所以我正在对照表记录检查它。

如果生成的激活码已经存在,则函数应该再次调用自身以生成新的激活码,整个过程继续进行,直到我们得到一个唯一的激活码,该激活码不存在于表记录中。

我的问题是,我是否正确编码了它,即递归部分。如果它不正确或者是否有人有更好或有效的方法来实现这一点,请告诉我。

注意:我从类文件中调用这些函数。简单地说,我正在使用 OOP。 所以我需要知道调用递归的代码应该是

return generateUniqueActivationCode();

return $this->generateUniqueActivationCode();

我们将不胜感激。

    // Generate Unique Activation Code
    //*********************************************************************************
    public function generateUniqueActivationCode()
    {
        $mysql = new Mysql();
        $string = new String();

        // This is coming from the 2nd part of code snippet that I have added
        $activation_code = $string->generateActivationCode();

        // Is Activation Code Unique Check
        $sql = "SELECT activation_id FROM ". TABLE_ACTIVATION_CODES ." WHERE activation_code='$activation_code' LIMIT 1";
        $query = $mysql->query($sql);

        if($mysql->rowCount($query) > 0)
        {
            // This function is calling itself recursively
            return generateUniqueActivationCode();
        }
        else
        {
            return $activation_code;
        }
    }

这是生成随机激活码的代码

class String
{
    // Generates A Random String (Can be used for generating password etc.)
    //*********************************************************************************
    public function generateRandomString($noofchars=8)
    {
        $salt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabchefghjkmnpqrstuvwxyz0123456789";
        srand((double)microtime()*1000000);
        $i = 0;
        while ($i <= $noofchars)
        {
            $num = rand() % 33;
            $tmp = substr($salt, $num, 1);
            $string = $string . $tmp;
            $i++;
        }
        return $string;
    }   
}
?>

【问题讨论】:

标签: php recursion


【解决方案1】:

我会这样输入:

public function generateUniqueActivationCode(){
        $mysql = new Mysql();
        $string = new String();
        do{
            $activation_code = $string->generateActivationCode();
            $sql = "SELECT activation_id FROM ". TABLE_ACTIVATION_CODES ." WHERE activation_code='$activation_code' LIMIT 1";
            $query = $mysql->query($sql);
        }while($mysql->rowCount($query) > 0);
        return $activation_code;
    }

执行(至少运行一次),但只要您的 rowCount 返回大于 0 的值就会重复。

【讨论】:

  • 你能解释一下你的编码是如何寻找唯一性的吗?我的意思是如果激活码已经在表中,那么函数将如何递归调用自身并生成新的激活码?
  • 如果它已经存在。这不是独一无二的,对吧?该函数称为 generateUniqueActivationCode,您将返回一个。
  • 我需要一个函数来返回一个唯一的激活码,该激活码根本没有使用或分配给任何记录。在我看来,您的函数正在做相反的事情,即如果表中有超过 0 条记录,则返回激活码。
  • 我会为您键入 do psuedo 样式:执行 ONE 或只要 WHILE 为真。如果匹配大于零,则在数据库中获取新的激活码搜索,重复php.net/manual/en/control-structures.do.while.php
  • 谢谢哥们,它成功了。很抱歉之前的问题,我没有理解逻辑,但是在阅读了 do while 循环手册之后,我明白了。再次感谢。干杯!!!!
猜你喜欢
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多