1

私はプログラミングの素晴らしさを探求し始めたばかりです。数値回文を識別するコードを作成しようとしています。文字ではなく、数字だけを見ています。ここで再帰の使い方を学ぼうとしています。しかし、私はどこにも行けず、何が問題なのかわかりません。

私のアイデアは、最初の文字列と最後の文字列をチェックし、一致する場合はこれら 2 つを削除して繰り返すことでした。最終的には何も残らない (回文であることを意味する) か、一致しないカップルが存在する (その逆を意味する)。

回文を見つけるためのより良いコードがあることは知っていますが、再帰を試してみたかっただけです。

では、何が問題なのですか?

def f(n):
    global li   
    li=list(str(n))
    if (len(li)==(1 or 0)):
        return True
    elif li[len(li)-1]==li[0]:
        del li[0]
        del li[len(li)-1]
        if len(li)==0:
            return True
        if len(li)>0:
            global x
            x=''.join(li)
            str(x)
            f(x)
    else:
      return False

前もって感謝します!

4

7 に答える 7

5

いくつかのコメント

  • なぜxliグローバルなのか? 再帰では、すべての変数がローカルでなければなりません。
  • strと の間で変換を行っているのはなぜlistですか? 両方に添字を付けることができます
  • 再帰呼び出しの結果を返す必要があります。 return f(x)

これらの提案を試して、それがどのように機能するかを確認してください。

于 2011-03-31T05:48:42.407 に答える
3

調べすぎる前に、if (len(li)==(1 or 0)):あなたが期待していることをしません。(1 or 0)は常に に評価され1ます。

あなたはおそらく欲しい:

if len(li) in (1, 0):
于 2011-03-31T05:43:56.120 に答える
3

あなたのソリューションにはいくつかの問題があります。行ごとに分析してみましょう。

  1. global関数スコープ外の変数を変更するつもりがない場合は、ステートメントは必要ありません。したがって、globalコードから を 2 行削除しました。

  2. li=list(str(n)): 文字列をリストにキャストする必要はありません。Python の文字列は不変リストと同様のインターフェースを持っているからです。したがって、単純なものli = str(n)で十分です。

  3. if (len(li)==(1 or 0)):: 問題ないように見えますが、実際には値を他のいくつかの値と比較する方法が正しくありません。このor演算子は、左または右のオペランドから最初の「真」の値を返すため、この場合は常に を返します1。代わりに、in左オペランドが右オペランドの要素であるかどうかをチェックする演算子を使用できます。右側のオペランドをタプルにすれば(1, 0)、すべてうまくいきます。さらに、ifステートメントを括弧で囲む必要はありません。あなたは書くべきです:if len(li) in (1, 0):

  4. elif li[len(li)-1]==li[0]:これは問題ありませんが、ネガティブ リスト インデックスをサポートしているため、Python ではこれを短く書くことができます。elif li[-1] == li[0]:

  5. ポイント2.のためにリスト(可変シーケンス)を使用しないため、それらを行うことはできませんdel li[0]。とにかく、リストの最初の要素を削除することは、Python では非常に非効率的です (リスト全体をコピーする必要があります)。まったく同じ理由から、できませんdel li[len(li)-1]。代わりに、「スプライシング」演算子を使用して、文字列から部分文字列を抽出できます。li = li[1:-1]

  6. if len(li)==0:は不要な長さです。Python では、空の文字列とリストは、if. だからあなたは書くことができますif not li:

  7. if len(li)>0:: が空でない場合は、もう一度確認する必要liはありません。ポイント 6 で確認しました。したがって、単純なものelse:で十分です。または、この行を完全に削除し、残りの関数のインデントを解除します。これifは、6.の本体にreturn. したがって、 を入力しなかった場合はifelseまったく書き込まずに になります。

  8. x=''.join(li): 2 で決定したため、文字列を文字列に変換する必要はありません。この行を削除します。

  9. str(x)str(): この行は、引数をその場で変更せずに新しい値を返すため、コード内で何も役に立ちませんでした (そのためx = str(x)、より意味があります)。削除することもできます。

  10. f(x): これは、Python で再帰関数を呼び出す有効な方法ですが、その値で何かを行う必要があります。おそらくそれを返しますか?これを次のように変更します: return f(li)(xもう変数がないため)。

最終的には次のコードになります。

def f(n):
    li = str(n)
    if len(li) in (1, 0):
        return True
    elif li[-1] == li[0]:
        li = li[1:-1]
        if not li:
            return True
        return f(li)
    else:
        return False

必要なものはほとんど揃っていますが、まだ少し改良することができます。行をif not li: return True見ると、それらが不要であることがわかります。それらを削除するfと、引数として空の文字列で呼び出され、len(li)0 に等しくなり、Trueとにかく返されます。したがって、次の行を削除します。

def f(n):
    li = str(n)
    if len(li) in (1, 0):
        return True
    elif li[-1] == li[0]:
        li = li[1:-1]
        return f(li)
    else:
        return False

以上です!成功するプログラマーになる道を頑張ってください!

于 2011-03-31T11:00:48.183 に答える
1

ショー全体をリストに分割してから、次のようにします。

def fun(yourList):
    if yourList.pop(0) == yourList.pop(-1):
        if len(yourList) < 2:
            return True # We're a palindrome
        else:
            return fun(yourList)
    else:
        return False # We're not a palindrome

print "1234321"
print fun(list("1234321")) # True
print "6234321"
print fun(list("6234321")) # False
于 2011-03-31T05:47:31.223 に答える
1
def palindrome(n):
    return n == n[::-1]
于 2013-09-24T11:14:15.100 に答える
0

コードから何をしようとしているのかを伝えるのは難しいですが、理解しやすいように、より単純な (これも再帰的な) 例を書きました。

def is_palindrome(num):
    s = str(num)
    if s[0] != s[-1]:
       return False
    elif not s[1:-1]:
       return True
    else:
       return is_palindrome(int(s[1:-1]))
于 2011-03-31T05:47:10.100 に答える
0
number = int(raw_input("Enter a number: "))

rev = 0
neg = number

original = number


if (number < 0):
    number = number * -1

else:

    number = number

while ( number > 0 ):

     k = number % 10

     number = number / 10

     rev = k + ( rev * 10 )

     if (number < 1):
         break

if ( neg < 0 ):
    rev =  ( rev * -1)

else:

    rev = (rev)

if ( rev == original):

    print "The number you entered is a palindrome number"

else:

    print "The number you entered is not a palindrome number"

このコードは、エラーが発生した場合に備えて、プログラミングに慣れていない負の数でも機能します。

于 2014-08-25T04:56:04.517 に答える