2015-04-29 23 views
5

happy number bulmak için özyinelemiyim.Özyinelemeli işlev içeren Python kodumdaki sorun nedir?

deepth = 0 
def is_happy_number(number): 
    astring = str(number) 
    global deepth 
    digits = [int(char) for char in astring] 
    sum_digit = sum([digit**2 for digit in digits]) 
    if sum_digit == 1: 
     deepth = 0 
     return True 
    else: 
     deepth += 1 
     if deepth >800: 
      return False 
    return is_happy_number(sum_digit) 

print '7',is_happy_number(7) 
for number in range(1,11): 
    print number,is_happy_number(number) 

sonuçlarıdır: yalnız sayı 7 sınamak

7 True 
1 True 
2 False 
3 False 
4 False 
5 False 
6 False 
7 False 
8 False 
9 False 
10 True 

, bu 'True' döndürür

şu benim Python kodudur. Son iki sıra kodunu çalıştırdığım sırada 7 numaralı 'False' döndürürüm.

Hangi bölümün yanlış olduğunu bilmiyorum.

Birkaç dakika sonra Python kodumun yanlış bölümünü buluyorum. Şunu da ekleyeyim:

deepth = 0 

sonra: @Will hatırlatmak ile

if deepth > 800: 

, bu soruna başka bir çözüm bulmak. Modifiye Kod aşağıdaki gibidir: Sen küresel değişkeni depth sıfırlamak için başarısız konum

def is_happy_number(number, deepth=0): 
    astring = str(number) 
    digits = [int(char) for char in astring] 
    sum_digit = sum([digit**2 for digit in digits]) 
    if sum_digit == 1: 
     return True 
    else: 
    deepth += 1 
    if deepth >800: 
     return False 
    return is_happy_number(sum_digit,deepth) 

print '7',is_happy_number(7,0) 
for number in range(1,10): 
    if is_happy_number(number,0): 
     print number, 
+3

Vahşi bir tahmin: 'global deepth' değişkeninin onunla bir ilgisi vardır (BTW," derinlik "yazılmalıdır). –

cevap

8

. Bununla başa çıkmanın daha iyi bir yolu, derinliği özyinelemeye aktarmaktır. Böyle

şey:

def is_happy_number(number, depth=0): 
    # ... as before ... 
    return is_happy_number(sum_digit, depth) 
+0

Çok teşekkür ederim. Senden öğrenmeliyim. Bunu hatırlatarak çözdüm. – zero

+1

Sorun değil. Yardım ettiğim için mutluyum. – Will

0

sorun sadece bir kez deepth tanımlamak olmasından kaynaklanır. Daha sonra, önceki değer yeniden kullanılır. Bunu çözmek için, Yanlış veya Doğru'yı döndürdüğünüzde deepth değerini 0 olarak ayarlamanız gerekir.

6

Barak Manos cevabında belirttiği gibi, deepth değişkeni buradaki suçludur. 800 derinliğe ulaşıldığı durumda sıfırlanmaz. Bu yapılırsa, kodunuz çalışır:

deepth = 0 

def is_happy_number(number): 
    astring = str(number) 
    global deepth 
    digits = [int(char) for char in astring] 
    sum_digit = sum([digit**2 for digit in digits]) 
    if sum_digit == 1: 
     deepth = 0 
     return True 
    else: 
     deepth += 1 
     if deepth >800: 
      deepth = 0 
      return False 

    return is_happy_number(sum_digit) 

print '7',is_happy_number(7) 
for number in range(1,11): 
    print number,is_happy_number(number) 

Tamamen bir global değişken kullanmaması gerektiğini Will katılıyorum.

+0

Teşekkürler. Çok hızlısın. Sorunu çözdüm.:) – zero

İlgili konular