2017-05-19 19 views
1

私は幸せな数字を見つけるプログラムを書こうとしています: more info here. これは学校の割り当てではありませんが、私はPython 2.7を練習しようとしています。 基本的には、すべての桁を二乗し続ける必要があるため、再帰はこれの不可欠な部分です。 私のコードでは、私はそれを実行し続けるために再帰を使用します。私は基底のケースを持っていますが、何らかの理由で、関数を呼び出しても再帰は起こりません。 最初の番号の数字の四角形を返すだけです。これはバグテストであり、Noneを返すと実行を停止します。 どうしたのですか?Python:再帰呼び出しなし値

num = raw_input('Pick a positive integer that you want to check for a happy number') 
def happyn(number,second,third,fourth): 
    if len(number) == 2: 
    go = int(number[0])**2 + int(number[1])**2 
    elif len(number) == 3: 
    go = int(number[0])**2 + int(number[1])**2 + int(number[2])**2 
    elif len(number) == 4: 
    go = int(number[0])**2 + int(number[1])**2 + int(number[2])**2 + int(number[2]**2) 

    if len(number) == 1 and int(number) == 1 or int(number) == 7: 
    return True 
    elif len(number) == 1: 
    return False 
    else: 
    print go 
    go = str(go) 
    go1 = go[0] 
    print go1 
    if len(go) == 1: 
     go1 = go[0] 
     happyn(go1,0,0,0) 
    elif len(go) == 2: 
     go1 = go[0] 
     go2 = go[1] 
     happyn(go1,go2,0,0) 
    elif len(go) == 3: 
     go1 = go[0] 
     go2 = go[1] 
     go3 = go[2] 
     happyn(go1,go2,go3,0) 
    elif len(go) == 4: 
     go1 = go[0] 
     go2 = go[1] 
     go3 = go[2] 
     go4 = go[4] 
     happyn(go1,go2,go3,go4) 


print happyn(num,0,0,0) 
+0

'行く= INT(番号[0])** 2 + INT(番号[1])** 2 + INT(番号[2])** 2 + INT(番号[2 ] ** 2) 'はバグのように見えます。これらのすべてのケースを置き換えるには 'go = sum(int(x)** 2 for x) 'を使用します –

答えて

4

すべての可能な実行分岐がそう再帰が動作しません、何かを返す必要があります。たとえば、これは間違っている:

happyn(go1,0,0,0) 

何も明示的に返されない場合、関数はNoneを返します。したがって、正しい方法は次のとおりです。

return happyn(go1,0,0,0) 

関数内の他のすべての終了点についても同様です。

0
  1. 再帰呼び出しの結果、つまりreturn happyn(go1, 0, 0, 0)は返されません。 Pythonでは、return文なしで終了する関数は暗黙的にNoneを返します。

  2. これは本当に再帰を使用するのには適していません。単純なwhileループが適しています。

    def sum_sq(i): 
        total = 0 
        while i: 
         total += (i % 10) ** 2 
         i //= 10 
        return total 
    
    def is_happy(i): 
        while i >= 10: 
         i = sum_sq(i) 
        return i in (1, 7) 
    
    def main(): 
        i = int(raw_input("Please enter a positive integer: ")) 
        if is_happy(i): 
         print("{} is a happy number.".format(i)) 
        else: 
         print("{} is an unhappy number.".format(i)) 
    
    if __name__=="__main__": 
        main()