0

重複の可能性:
「returnself」がNoneを返すのはなぜですか?

私はプロジェクトオイラー(http://projecteuler.net/problem=55)で問題55を解決しようとしてきましたが、答えがあると思ったので、問題が発生しました。私は問題55の解決策を望んでいません。ただ、私が間違ったことをしただけです。

これが私のコードです:(すべてが必要だとは思いません)

t=0
lychrel=0
called=0

def iteratepal(n):
    global t
    global called
    called+=1
    b = int(''.join(reversed(str(n))))
    #print ("n =",n,"\nb =",b,"\nb+n =",b+n,"\n")

    if ispal(b+n) or ispal(n):
        t=0
        return False

    if t<50:
        t+=1
        iteratepal(b+n)
    else:                          # Here's the prob
        t=0                        # this block is executed (because it prints "yea")
        print("yea")               # but it doesn't return True!
        return True                # you can try it yourself (even in the interpreter)

def ispal(n):
    if n == int(''.join(reversed(str(n)))):
        return True
    return False

print(iteratepal(196))

for i in range(0,200):
    if iteratepal(i)==True:
        lychrel+=1
        print(i,"is Lychrel!")
    else:
        print(i,"is not a Lychrel!")
print(lychrel)

助けてくれてありがとう、私はこれと本当に混乱しています。

4

2 に答える 2

4

の場合、関数を再帰的に呼び出しますt < 50が、戻り値には何もしません。

if t<50:
    t+=1
    iteratepal(b+n)
else:                          
    t=0                        
    print("yea")               
    return True

そのelse:場合、ブランチは実行されないため、None代わりに返されます。再帰呼び出しの結果を返したいと思うかもしれません。

if t<50:
    t+=1
    return iteratepal(b+n)
else:                          
    t=0                        
    print("yea")               
    return True

さらにいくつかのヒント:

  • ステートメントでテストする必要はありません==Trueif以下は問題なく機能します。

    if iteratepal(i):
    
  • テストを返すことができますが、def ispal(n)それ自体がブール結果であり、テストせずに返すだけです。

    def ispal(n):
        return n == int(''.join(reversed(str(n))))
    
于 2012-09-21T21:11:05.443 に答える
0

再帰の結果を返していません。これを変える

if t<50:
    t+=1
    iteratepal(b+n)

これに

if t<50:
    t+=1
    return iteratepal(b+n)
于 2012-09-21T21:12:16.333 に答える