Palindrome的递归不使用辅助功能?

时间:2015-11-28 10:28:09

标签: c# .net recursion

我写了一个递归来检查字符串是否是回文:

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

然而,我试图找到一种方法来执行相同的算法,而不使用递归(isPalindrome(.. , .. , ..))的辅助方法,但我仍然需要调用isPalindrome(...)

如何将两个函数合并为一个,其中递归算法不会调用任何其他函数?

4 个答案:

答案 0 :(得分:4)

用匿名方法替换单独的方法是可以接受的:

public static bool IsPalindrome(string value)
{
    if (value == null)
        return false;

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

    Func<string, int, int, bool> ip = null;
    ip = (v, sc, ec) =>
    {
        if (v[sc] != v[ec])
            return false;

        if (sc >= ec)
            return true;

        return ip(v, sc + 1, ec - 1);
    };

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

答案 1 :(得分:3)

下面:

public static bool IsPalindrome(string value)
{
    if ( value == null )
        return false;

    if ( value.Length <= 1 )
        return true;

    if ( value[0] != value[value.Length - 1] )
        return false;

    return IsPalindrome(value.Substring(1,value.Length - 2));
}

性能会很糟糕......因为这会分配n / 2个字符串...... 你可以用一个阵列窗口包装器做一些更聪明的事情...但我不记得.Net有内置的......

选项2:

public static bool IsPalindrome(IEnumerable<char> value)
    {
        if (value == null)
            return false;

        if (value.Count() <= 1)
            return true;

        if (value.First() != value.Last())
            return false;

        return IsPalindrome(value.Skip(1).Take(value.Count() - 1));
    }

这有一些希望获得更好的表现......取决于LINQ如何进行专业化......

测试了第二个,它的速度非常慢......

答案 2 :(得分:1)

如何使用while - 循环:

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(IsPalindrome("TEST"));
        Console.WriteLine(IsPalindrome("TESTSET"));
    }

    public static bool IsPalindrome(string value)
    {
        if ( value == null )
            return false;

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

        int startChar = 0;
        int endChar = value.Length - 1;

        while(value[startChar] == value[endChar] && startChar < endChar)
        {
            startChar++;
            endChar--;
            if(startChar >= endChar) return true;
        }

        return false;
    }
}

输出:

False
True

我更喜欢你的递归解决方案。

修改

或者......你可以用一个陈述来做到这一点:

public static bool IsPalindrome(string value)
{
    if ( value == null )
        return false;

     return value == new String(value.ToCharArray().Reverse().ToArray());
}

修改

使用for循环的另一种解决方案。它类似于反向然后进行比较。

public static bool IsPalindrome(string value)
{
    if ( value == null )
        return false;

    for(int i = 0, j = value.Length - 1; i < j; i++, j--) {
        if(value[i] != value[j]) return false;
    }

    return true;
}

答案 3 :(得分:0)

我会建议这样的事情:

public static bool IsPalindrome(string value)
{
    if ( value == null )
        return false;

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

    int i=0;
    bool _cont = true;
    while(_cont){

        if ( value[startChar+i] != value[endChar-i] ){
            _cont = false;
            return false;


        if ( (startChar+i) >= (endChar-i) ){
            i++;
        }
        else{
            _cont = false;
            return true;
        }
    }
}