-4

我无法理解这些步骤。

function Palindrome($str) {
    if ((strlen($str) == 1) || (strlen($str) == 0)) {
        echo " THIS IS PALINDROME";
    }
    else {
        if (substr($str,0,1) == substr($str,(strlen($str) - 1),1)) {
            return Palindrome(substr($str,1,strlen($str) -2));
        }
        else { echo " THIS IS NOT A PALINDROME"; }
    }
}

Palindrome("456");
4

3 回答 3

3
if ((strlen($str) == 1) || (strlen($str) == 0)) {
    echo " THIS IS PALINDROME";
}

如果strlen($str) <= 1这显然是一个回文。

else {
    if (substr($str,0,1) == substr($str,(strlen($str) - 1),1)) {
        return Palindrome(substr($str,1,strlen($str) -2));

     }

如果strlen($str) > 1字符串的第一个和最后一个字符相似,则在内部字符串(即没有第一个和最后一个字符的字符串)上调用相同的回文函数。

     else { echo " THIS IS NOT A PALINDROME"; }
}

如果第一个字符和最后一个字符不相等,则这不是回文。

原则是只测试外部字符,并在字符串的较小部分上一次又一次地调用相同的函数,直到它测试了每一对必须相等的字符,如果我们正在处理回文的话。

这称为递归

这张图片说明了发生的事情比我糟糕的英语更好:

在此处输入图像描述

图片来源

于 2013-06-21T13:57:00.517 回答
0

Palindrome("456")得到$str == "456". 所以,看看分支:

  • if ((strlen($str) == 1) || (strlen($str) == 0))-> 假的
  • if (substr($str,0,1) == substr($str,(strlen($str) - 1),1))与 相同if ("4" == "6")),为假,所以我们转到最后一个分支,输出“456”不是回文。

让我们看看Palindrome("454")gets会发生什么$str == "456"。所以,看看分支:

  • if ((strlen($str) == 1) || (strlen($str) == 0))-> 假的
  • if (substr($str,0,1) == substr($str,(strlen($str) - 1),1))与 相同if ("4" == "4")),为真,所以我们称Palindrome(substr($str,1,strlen($str) -2)),与 `Palindrome("5") 相同

现在,在该函数调用中,我们得到了新变量$str == "5"。执行相同的步骤,我们的第一个if是真的,所以我们回应它是一个回文。

对于递归,重要的是要记住每个函数调用都有自己的局部变量。换句话说,当您调用Palindrome(...)并再次调用该函数调用Palindrome(...)时,内存中有两个$str变量,一个属于第一个(外部)调用,一个属于第二个(内部)调用。当然,每个都只看到自己的,但是一旦退出内部调用,外部调用就没有变化 $str。这就是为什么我们$str == "454"在第一个电话和$str == "5"第二个电话中都有。它们的名称相同,但是是内存中存在的两个变量(直到您退出 的第二个(内部)调用Palindrome())。

于 2013-06-21T14:02:07.363 回答
0

是递归的...

所以它检查外部和内部字符。如果它们匹配,则继续到下一个最外/内的字符,即

NURSESRUN

将检查:第一个和最后一个字符是否相等?(N=N?) 是的。倒数第二个和倒数第二个相等吗?(U=U?)- 通过再次调用自己。这是递归。

如果遇到不相等的字符,它将退出并返回'NOT A PALINDROME' 如果它用完检查(偶数个字符的长度为零,奇数的字符串长度为 1)它达到“终止条件”(不再递归)并返回'THIS IS A PALINDROME'

于 2013-06-21T13:54:03.380 回答