Hướng dẫn how to end a recursive function python? - làm thế nào để kết thúc một hàm đệ quy python?

Bạn không "phá vỡ" các chức năng đệ quy. Cố gắng làm như vậy nói rằng bạn đang nghĩ về họ sai cách. Hiện tại cuộc gọi đệ quy của bạn đang bỏ qua đầu ra, điều đó có nghĩa là đệ quy là vô nghĩa; Bất cứ điều gì is_pal[middle[str]] trả về đều không ảnh hưởng đến giá trị trả về chức năng của bạn.

Thuật toán đệ quy giải quyết vấn đề đầu vào bằng cách phân tách vấn đề thành một vấn đề nhỏ hơn, đưa giải pháp cho vấn đề nhỏ hơn một cách đệ quy, và sau đó sử dụng giải pháp nhỏ hơn để xây dựng một giải pháp chính xác cho vấn đề lớn hơn. Bạn không "phá vỡ" trong các cuộc gọi bên trong, bạn trả lại một giải pháp sao lưu một cấp độ. Bạn không biết [hoặc cần biết] cho dù bạn đang ở trong một cuộc gọi bên trong hay cuộc gọi cấp cao nhất. Trong cả hai trường hợp, chức năng của bạn sẽ làm điều tương tự: trả về True nếu đối số là một palindrom và False nếu không.

Thuật toán bạn đang cố gắng thực hiện về cơ bản là:

  1. Nếu chuỗi có độ dài 1, đó là một palindrom [return True]
  2. Mặt khác, nếu ký tự đầu tiên giống như ký tự cuối cùng, thì đầu vào là một palindrom nếu các ký tự giữa là một palindrom.

Vì vậy, điều này có nghĩa là một khi bạn đã thiết lập các ký tự đầu tiên và cuối cùng giống nhau, câu trả lời cho "là đầu vào của tôi, một palindrom" giống hệt như câu trả lời cho "các ký tự giữa là một palindrom". Bạn cần trả lại câu trả lời đó để thực hiện hợp đồng của bạn. Vì vậy, cuộc gọi đệ quy nên là return is_pal[middle[str]] thay vì chỉ is_pal[middle[str]]. Nếu đây là một cuộc gọi cấp cao nhất, thì đó là câu trả lời; Nếu đây không phải là một cuộc gọi cấp cao nhất, thì cuộc gọi bên ngoài sẽ cần câu trả lời này để giải quyết câu trả lời cho vấn đề bên ngoài [trong trường hợp này, chỉ bằng cách trả lại nó].exactly the same as the answer to "are the middle characters a palindrome". You need to return that answer to fulfil your contract. So the recursive call should be return is_pal[middle[str]] rather than just is_pal[middle[str]]. If this was a top level call, then that's the answer; if this wasn't a top-level call, then the outer call is going to need this answer to work out the answer to the outer problem [in this case, by simply returning it].

BTW, thuật toán của bạn cũng có một số vấn đề khác.

  1. Bạn không bao giờ trả lại False, vì vậy câu trả lời không bao giờ có thể là False [trong trường hợp này bạn tình cờ trở lại Đối với False trong hầu hết các trường hợp, nhưng nó vẫn không thực sự chính xác].

  2. Nếu độ dài của chuỗi bằng 0 chứ không phải 1 [sẽ xảy ra nếu một chuỗi trống được truyền vào hoặc nếu một palindrom có ​​độ dài được truyền qua một lần Trả về câu trả lời đúng, và trên thực tế, bạn cố gắng lấy ký tự đầu tiên và cuối cùng của chuỗi trống, điều này sẽ gây ra một ngoại lệ.zero rather than 1 [which will happen if an empty string is passed in or if a palindrome of even length is passed in once all the pairs of equal first and last characters are stripped off], then you don't return the correct answer, and in fact you try to get the first and last character of the empty string, which will cause an exception.

Bạn có thể thoát ra khỏi một chức năng đệ quy?

Bạn không "phá vỡ" các chức năng đệ quy. Cố gắng làm như vậy nói rằng bạn đang nghĩ về họ sai cách. Hiện tại cuộc gọi đệ quy của bạn đang bỏ qua đầu ra, điều đó có nghĩa là đệ quy là vô nghĩa; Bất cứ điều gì is_pal [middle [str]] trả về không ảnh hưởng đến giá trị trả về chức năng của bạn.the base case and the recursive case.

  • Những gì là cần thiết để chấm dứt đệ quy?
  • Để đệ quy chấm dứt, mỗi lần phương pháp đệ quy tự gọi mình với phiên bản đơn giản hơn một chút của vấn đề ban đầu, chuỗi các vấn đề nhỏ hơn và nhỏ hơn phải hội tụ trên trường hợp cơ sở.

Các chức năng đệ quy là gì?

Các hàm đệ quy là & nbsp; các chức năng tự gọi. Nó luôn được tạo thành từ 2 phần, trường hợp cơ sở và trường hợp đệ quy.

Đơn vị của 4 là True1True1

Bây giờ chúng ta hãy phân tích những gì đang diễn ra trong chức năng đệ quy ở trên & nbsp;

  1. Đầu tiên, khi chúng ta chuyển số nguyên 4 vào hàm, nó sẽ đi đến trường hợp đệ quy True2 sẽ cho chúng ta True3. & nbsp;
     
  2. Tiếp theo, chức năng sẽ gọi True4 sẽ cung cấp cho chúng tôi True5 và nó tiếp tục cho đến khi chúng tôi có True6 [trường hợp cơ sở] và sau đó đệ quy sẽ chấm dứt. & NBSP; Điều này có nghĩa là nếu chúng tôi không có trường hợp cơ sở để ngăn chặn đệ quy, Chức năng sẽ tiếp tục tự gọi mình là vô thời hạn. & nbsp;
     
  3. Cuối cùng chúng ta sẽ có True7

Hình dung cách các mã hoạt động bằng cách nhấp vào nút tiếp theo bên dưới.Next button below.

Hoạt động 1

  • Câu hỏi
  • Câu trả lời

Viết một hàm đệ quy sẽ tổng hợp tất cả các số từ 1 đến n. & Nbsp;

n là đối số của hàm.

Hoạt động 2 [Thử thách]

  • Câu hỏi
  • Câu trả lời

Viết một hàm đệ quy sẽ tổng hợp tất cả các số từ 1 đến n. & Nbsp;

n là đối số của hàm.

HINT: 

Hoạt động 2 [Thử thách]

Xin chào,

Tôi có một chức năng, trông hơi như sau:

hàm def []:

Nếu điều kiện:
Làm công cụ, bao gồm một vài cuộc gọi đệ quy [để function []], 'công cụ' này cũng thay đổi trạng thái 'điều kiện'. 'Điều kiện' là một danh sách toàn cầu.
this 'stuff' also changes the state of 'condition'.
'condition' is a global list.
else:
Tôi muốn thoát ra khỏi chức năng và tiếp tục

Để thoát ra, tôi đã cố gắng chỉ gắn lại một khoản hoàn trả trong điều khoản khác, tôi cũng đã thử nâng một ngoại lệ [StandardError []] trong mệnh đề khác và sau đó bắt nó ở một ngoại trừ bên ngoài hàm, sau đó tiếp tục.

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, chức năng thực hiện 'công cụ' thành công, đạt được điều khoản khác, đánh vào mức trở lại hoặc sự cố bị bắt. Nhưng mặc dù vậy, chương trình luôn luôn quay trở lại một số cuộc gọi đệ quy trong mệnh đề IF.

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

Bất kỳ sự giúp đỡ nào cũng được đánh giá cao, tôi là một người mới rõ ràng, 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. 'Công cụ' 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,

Nathan

Bạn có thể thoát ra khỏi một chức năng đệ quy?

Bạn không "phá vỡ" các chức năng đệ quy.Cố gắng làm như vậy nói rằng bạn đang nghĩ về họ sai cách.Hiện tại cuộc gọi đệ quy của bạn đang bỏ qua đầu ra, điều đó có nghĩa là đệ quy là vô nghĩa;Bất cứ điều gì is_pal [middle [str]] trả về không ảnh hưởng đến giá trị trả về chức năng của bạn.. Trying to do so says you're thinking about them the wrong way. Currently your recursive call is ignoring the output, which means that the recursion is pointless; whatever is_pal[middle[str]] returns has no effect on the return value of your function.

Những gì là cần thiết để chấm dứt đệ quy?

Để đệ quy chấm dứt, mỗi lần phương pháp đệ quy tự gọi mình với phiên bản đơn giản hơn một chút của vấn đề ban đầu, chuỗi các vấn đề nhỏ hơn và nhỏ hơn phải hội tụ trên trường hợp cơ sở.the sequence of smaller and smaller problems must converge on the base case.

Bài Viết Liên Quan

Chủ Đề