2015-04-29 19 views
5

Tôi đang sử dụng đệ quy để tìm một số happy number.Có gì sai với mã Python của tôi có chứa hàm đệ quy?

Sau đây là mã Python tôi:

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) 

Kết quả là:

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

Khi tôi kiểm tra số 7 một mình, nó sẽ trả về 'True'. Trong khi tôi chạy hai mã thô cuối cùng, số 7 trả về 'False'.

Tôi không biết phần nào là sai.

Sau một vài phút, tôi tìm thấy phần sai trong mã Python của mình. Và tôi thêm:

deepth = 0 

sau:

if deepth > 800: 

Với sự nhắc nhở của @ Will, tôi tìm thấy một giải pháp cho vấn đề này. Mã sửa đổi là như sau:

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

Đoán ngẫu nhiên: biến 'toàn cầu 'có liên quan đến nó (BTW, nó phải được viết là" độ sâu "). –

Trả lời

8

Bạn đang thất bại trong việc thiết lập lại các biến toàn cầu depth. Một cách tốt hơn để giải quyết vấn đề này là chuyển độ sâu vào cuộc gọi đệ quy.

Something như thế này:

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

Cảm ơn bạn rất nhiều. Tôi nên học hỏi từ bạn. Tôi đã giải quyết nó bằng lời nhắc của bạn. – zero

+1

Không sao cả. Rất vui khi được giúp đỡ. – Will

0

vấn đề này xuất phát từ thực tế là bạn xác định deepth chỉ một lần. Sau đó, giá trị trước đó của nó được sử dụng lại. Để giải quyết vấn đề này, bạn phải đặt deepth thành 0 khi bạn trả về False hoặc True.

6

Như Barak Manos đã chỉ ra trong câu trả lời của mình, biến số deepth là thủ phạm ở đây. Nó không được đặt lại trong trường hợp đạt tới độ sâu 800. Nếu điều đó được thực hiện, mã của bạn hoạt động:

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) 

Tôi hoàn toàn đồng ý với Will rằng bạn không nên sử dụng biến toàn cầu.

+0

Cảm ơn bạn. Bạn nhanh thật. Tôi giải quyết vấn đề.:) – zero

Các vấn đề liên quan