Trong hướng dẫn này, bạn sẽ học cách viết một chương trình bằng Python để kiểm tra một số đã cho có phải là đối xứng hay không bằng cách sử dụng phương pháp đệ quy
Trước khi chuyển thẳng sang viết chương trình để kiểm tra xem một số đã cho có phải là số nghịch đảo hay không bằng đệ quy, bạn nên biết
Số Palindrom là gì?
Một số Palindrome là một số đảo ngược bằng số ban đầu có nghĩa là chính số đó
Ví dụ. 121, 111, 1223221, v.v.
Trong ví dụ trên, bạn có thể thấy rằng 121 là một số đối xứng. Vì đảo ngược của 121 giống như 121
Chương trình của chúng ta sẽ hoạt động như thế nào?
Giả sử nếu ai đó đưa ra đầu vào 121 thì chương trình của chúng ta sẽ in ra “số đã cho là một số đối xứng”
Và nếu ai đó đưa ra đầu vào 123, chương trình của chúng ta sẽ in ra “số đã cho không phải là số đối xứng”
Tôi sắp tham gia một trong các khóa học khoa học máy tính sử dụng Python được khoảng 3 tuần và cuộc thảo luận đã chuyển sang lập trình đệ quy. Nghe có vẻ hơi bí ẩn và phức tạp, nhưng hóa ra viết hàm đệ quy trong Python lại khá dễ. Người hướng dẫn đã tách quá trình viết hàm đệ quy thành một vài bước. Tôi nói về các bước này trong khi tôi viết một hàm Python đệ quy để phát hiện Palindromes
Palindrome
Từ Wikipedia, palindrome là một từ, cụm từ, số hoặc chuỗi ký tự khác đọc ngược hoặc xuôi giống nhau. Tôi đã rất ngạc nhiên khi tìm thấy toàn bộ trang web dành riêng cho danh sách các palindromes mà tôi đã sử dụng để thử nghiệm. Thông thường người ta bỏ qua khoảng trắng và dấu chấm câu trong các cụm từ. Chỉ các chữ cái và số là có ý nghĩa và được sử dụng để kiểm tra một bảng màu hợp lệ
Kiểm tra Palindrome
- Anh chuối ơi
- Dee nhìn thấy một hạt giống
- Không, nó đang mở trên một vị trí
Nhiệm vụ của tôi là viết một hàm đệ quy để phát hiện xem một từ hoặc cụm từ có phải là một bảng màu không
thuật toán
Khi tôi loại bỏ khoảng cách và dấu chấm câu khỏi các cụm từ cũng như biến tất cả các ký tự thành chữ thường, "Yo, cậu bé chuối. ", ví dụ, được rút gọn thành "yobananaboy"
Lúc đó mình chỉ cần so sánh ký tự đầu và ký tự cuối xem có giống nhau không. Nếu có, đây có thể là một palindrome. Nếu không, nó chắc chắn không phải là một palindrome. Trong trường hợp này, ký tự đầu tiên là "y" và ký tự cuối cùng là "y", vì vậy đây có thể là một bảng màu
Bước tiếp theo sẽ là xóa các ký tự đầu tiên và cuối cùng. Cụm từ bây giờ sẽ là "obananabo". Sau đó tôi sẽ so sánh các ký tự đầu tiên và cuối cùng trong chuỗi mới này. Nếu chúng giống nhau thì đây có thể là một bảng màu. Trong trường hợp này, ký tự đầu tiên là "o" và ký tự cuối cùng là "o", vì vậy đây có thể là một bảng màu
Tôi tiếp tục lặp đi lặp lại quá trình này cho đến khi còn lại 1 ký tự hoặc ít hơn trong cụm từ. Một chuỗi có 1 ký tự trở xuống được coi là một palindrome, vì nó giống nhau cả về phía trước và phía sau
Hàm đệ quy
Bây giờ tôi đã biết thuật toán, tôi có thể viết một hàm đệ quy để phát hiện các đối xứng
Đầu tiên, tôi cần một trường hợp cơ sở. Tôi cần một trường hợp chức năng ngừng thực hiện các cuộc gọi đệ quy. Dựa trên thuật toán, đây là khi tôi có 1 ký tự trở xuống. Trong những trường hợp này, nó là một palindrome và tôi có thể trả về True
if [len[phrase]] < 2: return True
Tiếp theo, tôi cần đơn giản hóa vấn đề thành một biểu thức toán học hoặc logic đơn giản hơn và gọi hàm để giải một phần nhỏ hơn của vấn đề
Nhìn vào thuật toán, biểu thức logic đơn giản hơn có thể là so sánh các ký tự đầu tiên và cuối cùng của cụm từ
phrase[0] == phrase[-1]
Sau đó, tôi có thể gọi hàm [tôi sẽ gọi hàm is_palindrome] để giải quyết một phần nhỏ hơn của chuỗi không bao gồm các ký tự đầu tiên và cuối cùng hiện tại
is_palindrome[phrase[1:len[phrase] - 1]]
Khi tôi đặt cái này lại với nhau, chức năng tôi đã tạo trông như thế này
def is_palindrome[phrase]: # base case if len[phrase] < 2: return True # divide into easier calculation # and recursive call return phrase[0] == phrase[-1] and \ is_palindrome[phrase[1:len[phrase] - 1]]
Chương trình
tôi chưa hoàn thành. Hóa ra đó là phần dễ dàng. Bây giờ tôi cần tạo một chương trình yêu cầu cụm từ từ người dùng và loại bỏ tất cả các ký tự không phải chữ và số trước khi gọi hàm. Mặc dù có rất nhiều cách để loại bỏ các ký tự không phải chữ và số [nhanh nhất có lẽ là một biểu thức chính quy], tôi chọn Hiểu danh sách vì đây là một tính năng khá thú vị trong Python
import string def is_palindrome[phrase]: # base case if len[phrase] < 2: return True # divide into easier calculation # and recursive operation return phrase[0] == phrase[-1] and \ is_palindrome[phrase[1:len[phrase] - 1]] while True: data = raw_input['Enter text [q to quit]: '] text = data.lower[] if text == 'q': break # strip all non alphanumeric characters # using Python list comprehension text = ''.join[[letter for letter in text if letter in [string.ascii_lowercase + string.digits]]] text_is_a_palindrome = is_palindrome[text] if text_is_a_palindrome: print "'{}' is a palindrome.".format[data] else: print "'{}' is not a palindrome.".format[data]
Phần kết luận
Tôi đã viết một số hàm đệ quy trong Python cho các bộ bài tập và bài tập. Tôi sẽ chia sẻ những điều đó vì nó giúp tôi nói về chúng và có thể giúp những người khác xem thêm các ví dụ về các hàm đệ quy để giúp làm rõ quy trình. Sau một vài tuần học Python, tôi thực sự bắt đầu đánh giá cao ngôn ngữ này và tận hưởng nó. Tại một thời điểm nào đó, tôi sẽ chia sẻ những lỗi cú pháp mà tôi mắc phải từ C#. NET. Tôi ngày càng ít mắc lỗi hơn, nhưng chúng vẫn xuất hiện chỗ này chỗ kia. Hi vọng điêu nay co ich