2017-12-02 20 views
5

Tôi đã viết đoạn mã sau:hàm đệ quy Dường như đơn giản kết thúc trong vòng lặp vô hạn

def incr_num(x, y): 
    while x <= y: 
     print x 
     incr_num(x+1, y) 

Khi tôi gọi đây là

incr_num(1, 10) 

nó được vào một vòng lặp vô hạn và cho sản lượng này:

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

(number 10 keeps repeating) 

Tôi đã hy vọng nó sẽ in số 1-10. Tôi không thể hiểu tại sao nó không. Ai đó có thể vui lòng cho tôi biết tại sao điều này xảy ra.

Tôi đang sử dụng python2.7.

+3

Bởi vì bạn không bao giờ thay đổi 'x', do đó 'trong khi x <= y' là luôn luôn đúng. – kindall

+2

Đệ quy vô hạn, hoặc vòng lặp vô hạn trong khi? –

+1

sử dụng nếu thay vì trong khi – Ciro

Trả lời

4

Phiên bản đúng sẽ là:

def incr_num(x, y): 
    if x <= y: 
     print x 
     incr_num(x+1, y) 

Lưu ý rằng x được in cùng một lúc nhất cho mỗi lần gọi hàm đệ quy.

CẬP NHẬT: Lý do chức năng của bạn không hoạt động là incr_num(10,10) in 10 rồi gọi incr_num(11,10), trả về ngay lập tức. Sau đó, incr_num(10,10) tiếp tục. Nó không thoát ra khỏi vòng lặp while và tiếp tục với lần lặp tiếp theo, in 10 và gọi lại incr_num(11,10) một lần nữa. Như bạn có thể thấy, chu trình này không kết thúc.

+0

Làm thế nào để bạn biết đây là phiên bản chính xác, vì OP không nói kết quả mong đợi là gì? –

+0

@ScottHunter Câu hỏi, có vẻ như tôi chỉ biết lý do tại sao chương trình không chấm dứt. – aquaman

+0

Có nhiều cách để làm cho chương trình chấm dứt; không nhiều trong số đó là chính xác. –

4

incr_num(x+1, y) tiếp tục nhận được gọi cho đến khi x == y, và sau đó là đệ quy kết thúc, sau đó bạn quay lại thực hiện trước nơi x=9, vì vậy x vẫn có giá trị nó trôi qua, và x <= y không phải là False. Do đó việc đệ quy lại xảy ra và in 10

Ít nhất bạn sẽ muốn một số x+=1 sau cuộc gọi đệ quy đó.

tôi sẽ không gọi một thời gian vòng lặp bên trong đệ quy đơn giản;) Nếu đó là trường hợp cơ sở của bạn cho kết thúc đệ quy, bạn muốn if x<=y

4

Nếu vòng lặp của bạn thực hiện mãi mãi, nó phải có nghĩa là tình trạng x <= y luôn là True. Hãy xem xét điều này:

while x <= y: 
    print x 

Đây là phiên bản đơn giản của mã, nhưng đó thực chất là những gì bạn đang làm.

Hãy thử:

def incr_num(x, y): 
    if x <= y: 
     print x 
     incr_num(x+1, y) 

này in những con số 1 qua 10.

+1

Tôi sẽ không đề nghị xóa * trong khi * vòng lặp, thay vào đó tăng ** x ** trước khi gọi 'incr_num'. – aquaman

3

Tình trạng của bạn phải là điều kiện if thay vì vòng lặp while vì bạn không thay đổi giá trị của x trong vòng lặp while và Everytime điều kiện trở thành true và thực hiện cuộc gọi đệ quy.

Đây là một phiên bản sửa chữa của nó

def incr_num(x, y): 
     if x <= y: 
      print x 
      incr_num(x+1, y) 
Các vấn đề liên quan