这个递归函数是否正确?

时间:2012-12-18 06:23:21

标签: php recursion

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

它是这样的: 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;
    }   
}
?>

1 个答案:

答案 0 :(得分:0)

我会这样输入:

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;
    }

Do(运行ATLEAST一次),但只要您的rowCount返回大于0的内容,就会重复。