用于在PHP中猜测密码的递归函数?



我需要编写一个可以猜测 4 个字符长密码的递归函数。 我正在使用它来生成一个随机的"密码":

/*start random password generating code*/
$random_password = "";
$charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for($i = 0; $i < 4; $i++){
$random_int = mt_rand();
$random_password .= $charset[$random_int % strlen($charset)];
}
echo "The password to guess is: " . $random_password . "n";
/*end random password generating code*/

我可以轻松地做同样的事情,并通过 while 循环检查它是否与密码匹配,但本练习旨在使用递归函数来完成。

我该怎么做?我之前的练习只是计算斐波那契数,但这有点超出这个数字。

我应该这样做吗:

$counter = array(1, 0, 0, 0);
function enumurate(){
global $counter;
if($counter[0] != 0){
echo $counter[0];
if($counter[1] != 0){
echo $counter[1];
if($counter[2] != 0){
echo $counter[2];
if($counter[3] != 0){
echo $counter[3];
}else{
echo 'error! $counter[3] is: ' . $counter[3];
}
}else{
echo 'error! $counter[2] is: ' . $counter[2];
}
}else{
echo 'error! $counter[1] is: ' . $counter[1];
}
}else{
echo 'error! $counter[0] is: ' . $counter[0];
}
}
enumurate();

我相信我正在寻找的东西是位移(在我迭代了 62 次[26 + 26 + 10 = 小写 + 大写 + 数字]之后),然后递归再次调用该函数,但我不知所措。

还是我想多了?

PS:我确实在谷歌上寻找过它,但由于某种原因,我找不到任何关于递归函数与字符串枚举匹配以及在此处检查的具体内容。不过,我的1337搜索技能可能让我失望了。

猜测您刚刚生成的密码似乎有点没用...你为什么不"猜"那个密码?此外,仅仅生成所有可能的 4 个字母的单词直到它等于您从一开始就知道的密码是没有乐趣的。谈论低效的代码...

为了使这不那么微不足道,我将假设需要猜测密码的函数不会将密码作为参数(因为这样它就可以将其作为唯一正确的猜测返回),而是会获得一个回调函数,它可以调用以验证以下哪项是正确的:

  • 猜测是完全正确的:回调将返回值 2
  • 猜测与密码的第一个字符匹配,但完全匹配需要更多的字符:在这种情况下,回调将返回 1
  • 所有其他情况:回调将返回 0

因此,该回调函数将如下所示:

function ($guess) use ($random_password) {
if ($guess === $random_password) return 2; // it is correct!
if (substr($random_password, 0, strlen($guess)) === $guess) return 1; // partial match;
return 0; // the password does not start with the guessed characters
}

通过此设置,挑战会更有趣一些,因为解决方案将不允许偷看它需要猜测的密码。

下面是递归解决方案(按照您的函数生成随机密码):

function getRandomPassword() { // Your function
$random_password = "";
$charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for($i = 0; $i < 4; $i++){
$random_int = mt_rand();
$random_password .= $charset[$random_int % strlen($charset)];
}
return $random_password;
}
function findPassword($evaluateGuess) {
$charset = str_split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
function guessTheRest(&$evaluateGuess, &$charset, $password) {
$match = $evaluateGuess($password); // call the callback function
if ($match === 0) return; // mismatch
if ($match === 2) return $password; // all characters correct
foreach ($charset as $char) { // taking each character as a "guess"
$guess = guessTheRest($evaluateGuess, $charset, $password . $char);
if ($guess) return $guess;
}
}
return guessTheRest($evaluateGuess, $charset, "");
}
$random_password = getRandomPassword();
echo "The password to guess is: $random_passwordn";
$guess = findPassword(function ($guess) use ($random_password) {
if ($guess === $random_password) return 2; // it is correct!
if (substr($random_password, 0, strlen($guess)) === $guess) return 1; // partial match;
return 0; // the password does not start with the guessed characters
});
echo "guessed $guessn";

看到它在 repl.it 上运行。

最新更新