2009-06-04 63 views
6

文字列が回文かどうかを検出する再帰関数を書くのに助けが必要です。しかし、私は再帰的でなければならないループを使用することはできません。誰でもこれがどのように行われているかを教えてもらえますか?私は次の中間期にこれを学ぶ必要があります。私はPythonを使用しています。 0商品を左Pythonの再帰関数回文簿

1):一般的なアルゴリズムの観点から

答えて

39

は、再帰関数は、3つのケースを有しています。項目は同一性によってpalindromeです。

2)1アイテム左。項目は同一性によってpalindromeです。

3)2以上の項目。最初と最後の項目を削除します。比較する。それらが同じ場合は、文字列の左にある関数を呼び出します。最初と最後が同じでない場合、項目はpalindromeではありません。

関数自体の実装は、読者への課題として残されている:)

3

文字列が長く、ゼロまたは1つの文字である場合、それは回文です。

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

今、文字列を取る回文関数として書いてください。それはそれ自身を呼ぶでしょう。ここで

2

はパリンドローム文字列が

  1. いくつかの手紙、Xある別の観点

    です。

  2. いくつかのパリンドロームサブリジン。

  3. 同じ文字、xが繰り返されます。

また、適切な英語の文章「Able was I ere was Elba」が表示される場合があります。句読点付き。あなたのpalindromeチェッカーは、静かに句読点をスキップする必要があります。また、大文字と小文字を区別せずに静かに一致させる必要があるかもしれません。これはやや複雑です。

  1. 先頭の句読点。いくつかの手紙、x

  2. 一部のパリンドローム部分文字列。

  3. 一部の文字は、xです。大文字と小文字は区別されません。いくつかの末尾の句読点。

そして、定義上、長さゼロのストリングはパリンドロームである。また、一文字の文字列(句読点を削除した後)は回文です。

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; 
1

ここでは、単純な再帰関数を考えることができます。問題を回避して、そのように考えることができます。どのように再帰的に回文を作るのですか?ここで私はそれを行う方法です...

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

次に、テストをビルドするためにそれを反転することができます。

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

そして、ここで私たちはとにかくコードを投稿している、と誰-ライナーはまだ投稿されていないので、最高の1ライナー

def ispalindrome(word): 
    return word == word[::-1] 
2

あり、ここに行く:

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

-1:誰かの宿題のためのコードを投稿する - あなたに恥を。 –

+2

これが実際の宿題だったら私はあなたに同意しますが、そうではありません。質問者は中途半端な学習をしています。それを理解しようとするのではなく、この答えを覚えておけば、彼を助けることはできません。確かに試験では、別の再帰問題を解決する必要があります。 – Stephan202

-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" 
1
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" 
+1

これは素晴らしいです – victor

+1

私はそれがどのように再帰的かを見ることができません。 – billwild

+5

@billwild再帰的には約0%です。 – Thomas

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') 
-2

誰もがここで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)