Làm thế nào để bạn dừng một hàm đệ quy trong python?

Tuy nhiên, khi bước qua trình gỡ lỗi của PyWin, đối với cả hai lần thử trên, hàm đều thực hiện 'công cụ' thành công, đạt đến mệnh đề khác tốt, trả về hoặc ngoại lệ bị bắt tốt. Nhưng bất chấp điều này, chương trình luôn quay lại một số lời gọi đệ quy trong mệnh đề if

Tôi chỉ muốn nó kết thúc khi nó chạm vào cái khác

Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao, tôi rõ ràng là một người mới, vì vậy hy vọng vấn đề này có một giải pháp rõ ràng

Tôi đang chạy Py2. 5 trên XPpro, sử dụng PyWin để chỉnh sửa và gỡ lỗi. 'Nội dung' liên quan đến việc xử lý một số XML, tôi đang sử dụng lxml2. 0. 1

Cảm ơn trước,

Na-than

25 Mar '08 #1

6

Làm thế nào để bạn dừng một hàm đệ quy trong python?
20668
Làm thế nào để bạn dừng một hàm đệ quy trong python?

Làm thế nào để bạn dừng một hàm đệ quy trong python?

Bạn có thể làm sys. exit(0) miễn là bạn sẵn sàng dừng hoàn toàn chương trình của mình; .
Khi sử dụng đệ quy, điều quan trọng là có thể theo dõi những gì bạn đang làm và có chiến lược thoát phù hợp. Đối với tôi, có vẻ như bạn chưa thiết lập đệ quy đúng cách nên sẽ hữu ích trong tình huống này nếu bạn có thể đơn giản hóa mã của mình càng nhiều càng tốt và cho chúng tôi ví dụ về một đoạn mã nhỏ vẫn tái tạo lỗi này.

P. S. nó không đúng với tôi khi bạn nói "một vài cuộc gọi đệ quy". đây phải là "một cuộc gọi đệ quy", một cách khôn ngoan khác trước mỗi cuộc gọi đệ quy, bạn sẽ cần một điều kiện if. phá vỡ / trả lại nếu không bạn sẽ không có bất kỳ độ tin cậy nào

25 Mar '08 #2

chào, cảm ơn vì đã phản hồi nhanh chóng. Mã của tôi đang xử lý một số XML (cụ thể là MathML) được biểu thị bằng cây tài liệu lxml. Đây là một đoạn mã của tôi, với một vài ví dụ về các cuộc gọi đệ quy dường như không mang lại lợi ích gì cho tôi

  1. kiểm soát def()
  2. nếu want_list. #nếu một danh sách toàn cầu được điền
  3. want_variable = wanted_list[-1]
  4. nếu wanted_variable trong Glob_Vars. #Glob_Vars là một từ điển, xem bên dưới
  5. danh sách truy nã. xóa (wanted_variable)
  6. control()      #restart vòng lặp với biến tiếp theo trong danh sách
  7. khác.             
  8. found_variable = search(wanted_variable)[0]    #finds một phiên bản của biến trong cây tài liệu, được gọi là found_variable
  9. nếu Final_test(found_variable) == True. #nếu biến_tìm_thấy là có dạng biến_biến_tìm_thấy == 'một hằng số'
  10. write_to_Glob_Vars(found_variable)   #write found_variable và giá trị 'hằng số' của nó vào Từ điển Toàn cầu
  11. danh sách truy nã. remove(wanted_variable)    #remove khỏi wanted_list vì giá trị của nó đã được tìm thấy và được lưu trữ (trong Glob_Vars)
  12. replace_all(found_variable)       #replaces tất cả trường hợp của found_biến trong cây tài liệu bằng giá trị của nó dưới dạng hằng số
  13. điều khiển()
  14. khác
  15. """more lồng nhau if/else làm thay đổi cây tài liệu và cũng dẫn đến các biến được cộng và trừ từ wanted_list, các lệnh gọi đệ quy tương tự đến một ở trên sau đó được thực hiện. """
  16. khác
  17. quay lại     #tôi ước

Như tôi đã đề cập trước đây, cây tài liệu được xử lý tốt và câu lệnh khác cuối cùng đạt được đúng điểm tức là. khi Want_list trống. Tuy nhiên, khi luồng chương trình đến lệnh gọi trả về, thay vì kết thúc - như tôi yêu cầu - nó chuyển sang lệnh gọi điều khiển đệ quy() trong mệnh đề khác đầu tiên và cũng lặp đi lặp lại các lệnh gọi đệ quy khác trong các lệnh if-else lồng nhau khác đã đề cập

Hy vọng đây là thứ bạn muốn xem, tôi nhận ra nó lớn hơn đoạn mã một chút và chứa khá nhiều chức năng tôi chưa định nghĩa ở đây

Chúc mừng một lần nữa,

Na-than

26 Mar '08 #3

Vấn đề là sau khi lệnh gọi đệ quy trả về, nếu vẫn còn mã được thực thi (bạn không gọi nó như một phần của lệnh trả về), thì mã đó sẽ chạy mã đó. Để giải quyết vấn đề này, hãy yêu cầu nó trả về một cái gì đó, chẳng hạn, Không và thực hiện từng lệnh gọi đệ quy dưới dạng điều khiển trả về()

26 Mar '08 #4

chào, cảm ơn vì đã phản hồi nhanh chóng. Mã của tôi đang xử lý một số XML (cụ thể là MathML) được biểu thị bằng cây tài liệu lxml. Đây là một đoạn mã của tôi, với một vài ví dụ về các cuộc gọi đệ quy dường như không mang lại lợi ích gì cho tôi

  1. kiểm soát def()
  2. nếu want_list. #nếu một danh sách toàn cầu được điền
  3. want_variable = wanted_list[-1]
  4. nếu wanted_variable trong Glob_Vars. #Glob_Vars là một từ điển, xem bên dưới
  5. danh sách truy nã. xóa (wanted_variable)
  6. control()      #restart vòng lặp với biến tiếp theo trong danh sách
  7. khác.             
  8. found_variable = search(wanted_variable)[0]    #finds một phiên bản của biến trong cây tài liệu, được gọi là found_variable
  9. nếu Final_test(found_variable) == True. #nếu biến_tìm_thấy là có dạng biến_biến_tìm_thấy == 'một hằng số'
  10. write_to_Glob_Vars(found_variable)   #write found_variable và giá trị 'hằng số' của nó vào Từ điển Toàn cầu
  11. danh sách truy nã. remove(wanted_variable)    #remove khỏi wanted_list vì giá trị của nó đã được tìm thấy và được lưu trữ (trong Glob_Vars)
  12. replace_all(found_variable)       #replaces tất cả trường hợp của found_biến trong cây tài liệu bằng giá trị của nó dưới dạng hằng số
  13. điều khiển()
  14. khác
  15. """more lồng nhau if/else làm thay đổi cây tài liệu và cũng dẫn đến các biến được cộng và trừ từ wanted_list, các lệnh gọi đệ quy tương tự đến một ở trên sau đó được thực hiện. """
  16. khác
  17. quay lại     #tôi ước

Như tôi đã đề cập trước đây, cây tài liệu được xử lý tốt và câu lệnh khác cuối cùng đạt được đúng điểm tức là. khi Want_list trống. Tuy nhiên, khi luồng chương trình đến lệnh gọi trả về, thay vì kết thúc - như tôi yêu cầu - nó chuyển sang lệnh gọi điều khiển đệ quy() trong mệnh đề khác đầu tiên và cũng lặp đi lặp lại các lệnh gọi đệ quy khác trong các lệnh if-else lồng nhau khác đã đề cập

Hy vọng đây là thứ bạn muốn xem, tôi nhận ra nó lớn hơn đoạn mã một chút và chứa khá nhiều chức năng tôi chưa định nghĩa ở đây

Chúc mừng một lần nữa,

Na-than

Hãy thử thay thế nó bằng vòng lặp while. Một vòng lặp while sẽ liên tục thực thi tất cả các mã bên trong khi điều kiện là đúng. Ngoài ra, từ khóa ngắt sẽ thoát khỏi vòng lặp.

  1. trong khi một sốĐiều kiện.
  2. # thực thi một số mã

26 Mar '08 #5

Cảm ơn tất cả những lời đề nghị

Tôi đã thay thế các lệnh gọi điều khiển đệ quy() bằng điều khiển trả về() và mệnh đề khác cuối cùng bằng trả về Không có. Tuy nhiên, nó vẫn nhấn return Không, sau đó nhảy lên một số điều khiển trả về () trái ngược với kết thúc

Thay vào đó, tôi đã đặt một công việc bodge xấu xí vào chức năng gây ra lỗi, vì vậy hành vi không mong muốn vẫn còn đó, nhưng bây giờ là vô hại. Ít nhất là đối với các trường hợp thử nghiệm của tôi, điều này sẽ phải thực hiện khi tôi không có nhiều thời gian

Tôi cũng đã thử thực hiện nó trong một vòng lặp trước đây, nhưng gặp nhiều trở ngại hơn và khiến bản thân bối rối

Điều gì dừng một chức năng đệ quy?

Điều kiện ngăn hàm đệ quy gọi chính nó được gọi là trường hợp cơ sở . Trong hàm nhật ký ở trên, trường hợp cơ bản là khi num lớn hơn 5.

Bạn có thể dừng đệ quy?

Trong một hàm đệ quy, phải có một điều kiện kết thúc cho phép hàm thoát mà không cần gọi chính nó . Điều kiện này cho phép dừng đệ quy - nghĩa là không có nó, hàm sẽ tự gọi đi gọi lại chính nó, dẫn đến lỗi.