10

文字列が回文かどうかを検出する再帰関数を作成するのに助けが必要です。しかし、再帰的でなければならないループは使用できません。誰でもこれがどのように行われるかを教えてくれますか? 私はPythonを使用しています。

4

11 に答える 11

67
def ispalindrome(word):
    if len(word) < 2: return True
    if word[0] != word[-1]: return False
    return ispalindrome(word[1:-1])

そして、これが最高のワンライナーです

def ispalindrome(word):
    return word == word[::-1]
于 2009-06-04T19:32:06.923 に答える
46

一般的なアルゴリズムの観点から、再帰関数には3つのケースがあります。

1)残り0個。アイテムは、アイデンティティによる回文です。

2)残り1アイテム。アイテムは、アイデンティティによる回文です。

3)2つ以上のアイテム。最初と最後のアイテムを削除します。比較。それらが同じである場合は、文字列の残りの部分で関数を呼び出します。最初と最後が同じでない場合、アイテムは回文ではありません。

関数自体の実装は、読者の練習問題として残されています:)

于 2009-06-04T17:55:26.463 に答える
3

文字列の長さが0文字または1文字の場合、それは回文です。

文字列の最初と最後の文字が同じで、残りの文字(Pythonではスライスだと思います[1: -1]が、私のPythonは少し錆びています)が回文である場合、それは回文です。

さて、それを文字列を取る回文関数として書いてください。自分自身を呼び出します。

于 2009-06-04T17:55:42.173 に答える
3

とにかくコードを投稿していて、ワンライナーはまだ投稿されていないので、ここに行きます:

def palindrome(s):
    return len(s) < 2 or s[0] == s[-1] and palindrome(s[1:-1])
于 2009-06-04T19:41:57.807 に答える
2

ここに別の視点があります

パリンドローム文字列は

  1. いくつかの文字、x .

  2. いくつかのパリンドローム部分文字列。

  3. 同じ文字xの繰り返し。

また、「Able was I ere I saw Elba.」という適切な英文が表示される場合があることに注意してください。句読点付き。回文チェッカーは、句読点を静かにスキップする必要がある場合があります。また、大文字と小文字を区別せずに静かに一致させる必要がある場合もあります。これはもう少し複雑です。

  1. いくつかの先頭の句読点。いくつかの文字、x .

  2. いくつかの回文部分文字列。

  3. 大文字と小文字を区別せずに繰り返される文字x 。いくつかの末尾の句読点。

また、定義上、長さ 0 の文字列は回文です。また、1 文字の文字列 (句読点を削除した後) も回文です。

于 2009-06-04T18:03:40.740 に答える
2

単純な再帰関数を考える方法は次のとおりです...問題をひっくり返して、そのように考えてください。どのように回文を再帰的に作成しますか? これが私がそれを行う方法です...

def make_palindrome():
    maybe:
        return ""
    elsemaybe:
        return some_char()
    else:
        c = some_char()
        return c + make_palindrome() + c

次に、それを裏返してテストを作成できます。

于 2009-06-04T18:16:59.547 に答える
1

関数は文字列を期待する必要があります。文字列に複数の文字がある場合は、最初と最後の文字を比較します。1 文字または 0 文字の場合、true を返します。2 つの文字が等しい場合は、最初と最後の文字なしで、文字列を使用して関数を再度呼び出します。等しくない場合は false を返します。

 palindrom( word):
   IF length of word 1 or 0 THEN
      return 0;
   IF last and first letter equal THEN
     word := remove first and last letter of word;
     palindrom( word);
   ELSE
     return false;
于 2009-06-04T18:04:03.860 に答える
0
a=raw_input("enter the string:")
b=len(a)
c=0
for i in range(b):
    if a[i]==a[-(i+1)]:
        c=c+1
if c==b:
    print a,"is polindrome"
else:
    print a,"is not polindrome"
于 2011-03-29T10:36:38.673 に答える
0

私の解決策

#To solve this I'm using the stride notation within a slice [::]
def amazonPalindrome(input):
    inputB = input
    input = input[::-1]
    #print input
    noPalindrome = inputB + " is not a palindrome"
    isPalindrome = inputB + " is a palindrome"
    #compare the value of the reversed string to input string
    if input[0]!= input[-1]: 
        print noPalindrome
    else:
        print isPalindrome


#invoking the def requires at least 1 value or else it fails
#tests include splitting the string,mixing integers, odd amount palindromes.
#call the def  
amazonPalindrome('yayay')
于 2011-04-29T07:40:49.120 に答える
-1
n=raw_input("Enter a number===>")
n=str(n)
l=len(n)
s=""
for i in range(1,l+1):
    s=s+n[l-i]
if s==n:
    print "Given number is polindrom"
else:
    print "Given number is not polindrom"
于 2010-08-10T09:47:26.530 に答える
-1

これが C バージョンです。C コードを検索してここにたどり着いた人がいるなら!

int IsPalindrome_Recursive(char *s, int start, int end)
{
    if ((end - start) < 2)
    {
        return 1;
    }
    if (s[start] != s[end])
    {
        return 0;
    }
    return IsPalindrome_Recursive(s, ++start, --end);
}

次のように呼び出します。

IsPalindrome_Recursive(s, 0, strlen(s) - 1)
于 2011-10-22T04:21:14.123 に答える