回文测试的递归算法

时间:2015-03-10 15:38:59

标签: c# recursion palindrome

这是我做的回文测试的常规方法,但我需要一个递归函数来检查数字是否为回文数据。

int number, firstnumber, lastnumber, secondnumber, fourthnumber;

readingnumber:

Console.Write("Please enter your palindrome number(5 digits) :" );
//reading the integer number entered
number = Int32.Parse(Console.ReadLine());
//making condition if the number is less than 5 digits
if (number / 100000 != 0)
    goto readingnumber;
else
{
    //we are taking each element alone 
    firstnumber = number / 10000;
    lastnumber = number % 10;
    fourthnumber = (number % 100) / 10;
    secondnumber = (number % 10000) / 1000;

    //making if condition to verify if the number is palindrom or not
    if (firstnumber == lastnumber && secondnumber == fourthnumber)
        Console.WriteLine("\n\nthe number you've enter is palindrom");
    else
        Console.WriteLine("\n\nthe number you've enter is not palindrom");

    //end of program
    Console.WriteLine("\n\n\n\t\tPlease enter any key to exit ...");
}

Console.ReadLine();

3 个答案:

答案 0 :(得分:1)

字符串palindrom是否

  • 包含少于1个字符
  • [0]处的字符== [长度 - 1]处的字符和内部字符串[1..Length - 2]是palindrom

所以

public static Boolean IsPalindrom(String value) {
  if (null == value)
    return true; //TODO: or false or throw exception

  if (value.Length <= 1)
    return true;
  else  
    return (value[0] == value[value.Length - 1]) && 
           (IsPalindrom(value.Substring(1, value.Length - 2)));
}

如果你想测试一个号码(例如12321)作为回文,只需将其转换为string

  int value = 12321;
  Boolean result = IsPalindrom(value.ToString(CultureInfo.InvariantCulture));

答案 1 :(得分:1)

一般来说, NOT 以递归方式使用Substring作为最终创建大量字符串的好习惯(实际上,这里所有字符串的内存使用量都会增加二次,长度为字符串)。

String.Intern的MSDN参考说:

  

公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串实例仅在系统中存在一次。

对于任何给定的字符串,例如"abcdedcba",如果递归使用Substring,您最终会放置"bcdedcb""cdedc""ded" ,并"e"不必要地进入实习池。


相反,最好将相同的字符串传递给递归方法,并改变两个索引来确定要比较哪些字符。字符串函数很慢,但整数是值类型,可以通过放弃同性恋来创建和丢弃。


<强>实施

/// <summary>
/// Returns true if the string is a palindrome (an empty string is a palindrome).
/// Returns false if the string is null or not a palindrome.
/// </summary>
public static bool IsPalindrome(string value)
{
    if ( value == null )
        return false;

    if ( value.Length == 0 )
        return true;

    return isPalindrome(value, 0, value.Length - 1);
}

private static bool isPalindrome(string value, int startChar, int endChar)
{
    if ( value[startChar] != value[endChar] )
        return false;

    if ( startChar >= endChar )
        return true;

    return isPalindrome(value, startChar + 1, endChar - 1);
}

<强>用法

public static void Main()
{
    var a = IsPalindrome(""); // true
    var b = IsPalindrome("1"); // true
    var c = IsPalindrome("11"); // true
    var d = IsPalindrome("121"); // true
    var e = IsPalindrome("123"); // false
}

Run it here on ideone.com

答案 2 :(得分:0)

<强> Run Here

    class Program
        {
            public static void Main()
            {
                var x = 545;
                var y = 548785445;
                Console.WriteLine(IsPalindrome(x.ToString()));
                Console.WriteLine(IsPalindrome(y.ToString()));
            }

            public static bool IsPalindrome(string text)
            {
                if (text.Length <= 1)
                    return true;
                else
                {
                    if (text[0] != text[text.Length - 1])
                        return false;
                    else
                        return IsPalindrome(text.Substring(1, text.Length - 2));
                }
            }


        }