web-dev-qa-db-ja.com

Pythonの再帰関数パリンドローム

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

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]
53
Unknown

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

1)残り0アイテム。アイテムは パリンドローム 、アイデンティティによるものです。

2)残り1アイテム。アイテムは パリンドローム 、アイデンティティによるものです。

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

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

42
GWLlosa

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

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

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

3
David Thornley

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

回文文字列は

  1. いくつかの手紙、x

  2. いくつかの回文のsubstrinng。

  3. 同じ文字xが繰り返されました。

また、「エルバを見たのは可能だった」という適切な英語の文章が与えられる場合があることに注意してください。句読点付き。回文チェッカーは、句読点を静かにスキップする必要がある場合があります。また、ケースを考慮せずに静かに一致する必要があるかもしれません。これは少し複雑です。

  1. いくつかの主要な句読点。いくつかの手紙、x

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

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

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

2
S.Lott

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

def palindrome(s):
    return len(s) < 2 or s[0] == s[-1] and palindrome(s[1:-1])
2
Stephan202

関数は文字列を期待する必要があります。文字列に複数の文字がある場合は、最初の文字と最後の文字を比較します。 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;
1
seb

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

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

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

1
Dietrich Epp
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"
0
victor

私の解決策

#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')
0
Surfdork