- Tạo ứng dụng Spring Boot bằng Spring Launchizr
- Cấu hình Cassandra trong Spring Boot
- Định cấu hình nhóm kết nối Tomcat trên Spring Boot
- Định tuyến tin nhắn Camel đến Artemis được nhúng bằng WildFly
Hàm đệ quy là hàm gọi chính nó trực tiếp hoặc gián tiếp thông qua một loạt câu lệnh. Đệ quy đóng một vai trò quan trọng trong lập trình. Trong nhiều trường hợp, các vấn đề có thể được giải quyết một cách dễ dàng với sự trợ giúp của đệ quy. Phần này chủ yếu giới thiệu các khái niệm cơ bản về đệ quy và cách xây dựng chương trình đệ quy.
Sau khi học xong phần này bạn cần nắm vững những nội dung sau:
Đệ quy là một phương pháp giải bài toán liên tục chia bài toán thành các bài toán con nhỏ hơn và giải bài toán bằng cách xử lý các bài toán con chung. Hàm đệ quy là hàm gọi chính nó trực tiếp hoặc gián tiếp thông qua một loạt câu lệnh. Cần lưu ý rằng mỗi khi một hàm đệ quy gọi chính nó, nó sẽ đơn giản hóa bài toán ban đầu và cuối cùng chuỗi các bài toán nhỏ hơn phải hội tụ về trường hợp cơ sở, giải quyết bài toán và chấm dứt đệ quy. Đệ quy có thể được sử dụng để giải quyết các vấn đề phức tạp một cách rất dễ dàng. Nhiều hàm toán học được định nghĩa đệ quy, chẳng hạn như hàm giai thừa được định nghĩa đệ quy:
n ! = { 1 , n = 0 n ( n − 1 ) ! , n > 1 n! = \begin{cases} 1, & {n=0} \ n(n-1)!, & {n>1 } \end{cases}n!={1,n(n−1)!,n=0n>1
Mặc dù định nghĩa này là đệ quy nhưng nó không phải là một vòng lặp vô hạn không thể kết thúc. Trên thực tế, giai thừa có thể được tính rất đơn giản bằng cách sử dụng hàm này. Ví dụ, khi tính 3 ! 3! 3!, theo định nghĩa, 3 ! = 3 ( 3 – 1 ) ! = 3 ( 2 ! ) 3!=3(3–1) = 3(2!)3 !=3( 3–1)!=3(2!), tiếp theo chúng ta cần giải tìm 2 ! 2!2!, và áp dụng lại định nghĩa 3! = 4(2!) = 3[(2)(2 −1)!] = 3(2)(1!), hãy tiếp tục quá trình này và cuối cùng chúng ta cần tính 0! 0!0!, và theo định nghĩa 0!=10!=1, quá trình tính toán kết thúc:
3 ! = 3 ( 2 ! ) = 3 ( 2 ) ( 1 ! ) = 3 ( 2 ) ( 1 ) ( 0 ! ) = 3 ( 2 ) ( 1 ) ( 1 ) = 3(2!) = 3(2)(1!)= 3(2)(1)(0!)= 3(2)(1)(1)=63!=3(2!)=3(2)(1!)=3(2)(1)(0!)=3(2)(1)(1 )=6
Như bạn có thể thấy, định nghĩa đệ quy không phải là một vòng lặp vô hạn, bởi vì mỗi lần định nghĩa được áp dụng, chương trình sẽ chia bài toán thành các bài toán con đơn giản hơn, trong trường hợp ví dụ về hàm giai thừa, tính giai thừa của các số nhỏ hơn cho đến 0 !0!, có thể được giải quyết mà không cần áp dụng đệ quy. Khi đệ quy kết thúc, chúng ta nhận được một biểu thức đóng có thể được đánh giá trực tiếp, còn được gọi là "đệ quy"Tình huống cơ bản
". Khi một hàm gọi chính nó để thực hiện một nhiệm vụ con, nó được gọi là "trường hợp đệ quy
".
Hàm đệ quy là một kỹ thuật lập trình quan trọng được mượn từ toán học. Nói chung, việc sử dụng đệ quy có thể làm giảm đáng kể số lượng mã và rất hữu ích trong nhiều tác vụ có thể được phân tách thành các bài toán con, chẳng hạn như sắp xếp, duyệt và tìm kiếm. được thực hiện với sự trợ giúp của các phương pháp đệ quy cung cấp giải pháp nhanh chóng.
Giống như nhiều thuật toán, đệ quy cũng có những nguyên tắc quan trọng cần phải tuân theo, gọi là ba nguyên tắc đệ quy:
Cần lưu ý rằng ý tưởng cốt lõi của đệ quy không phải là lặp mà là chia bài toán thành các bài toán con nhỏ hơn và dễ giải quyết hơn.
Đệ quy đóng một vai trò rất quan trọng trong lập trình Sau đây là một số tình huống thực tế mà đệ quy thường được sử dụng:
Trong phần này, chúng ta sẽ bắt đầu với một bài toán tổng danh sách đơn giản, xem cách sử dụng thuật toán đệ quy và sau đó tìm hiểu cách giải bài toán đệ quy cổ điển - Tháp Hà Nội.
Danh sách tổng hợp là một vấn đề rất đơn giản và nó hoàn hảo để hiểu ý tưởng của thuật toán đệ quy. Ví dụ chúng ta cần tính toán danh sách [1, 2, 3, 4, 5]
Nếu sử dụng hàm vòng lặp để tính tổng, bạn có thể viết đoạn mã sau để tính tổng của tất cả các số trong danh sách:
def sum_list(list_data): result = 0 for i in range(list_data): result += i trả về kết quả
Làm cách nào để giải quyết vấn đề này mà không sử dụng vòng lặp? Chúng ta có thể viết quá trình tính tổng ( ( ( ( 1 + 2 ) + 3 ) + 4 ) + 5 ) ((((1+2)+3)+4)+5)((((1+2)+ 3 )+4)+5), và theo định luật giao hoán của phép cộng, quá trình tính toán cũng có thể được viết là ( 1 + ( 2 + ( 3 + ( 4 + 5 ) ) ) ) (1+(2+(3+(4+5))))(1+(2+(3+(4+5)))), thì ta thấy rõ rằng tổng của các dữ liệu trong danh sách Bằng đến phần tử đầu tiên của danh sách cộng với các phần tử còn lại:
sum_list (list_data) = list_data [0] + sum_list (list_data [1:]) sum_list(list_data)=list_data[0]+sum_list(list_data[1:])sum_list(list_data) =list_data[0]+sum_list(list_data[ 1:])
sử dụng trăn
Việc thực hiện phương trình trên như sau:
def sum_list(list_data): if len(num_list) == 1: return list_data[0] else: return list_data[0] + sum_list(list_data[1:])
Trong mã, các điều kiện để hàm thoát được đưa ra trước tiên. Đây là tình huống cơ bản của hàm đệ quy. Trong ví dụ, nó có nghĩa là tổng các phần tử của một danh sách có độ dài bằng 1 là số trong danh sách. danh sách. Nếu điều kiện thoát không được đáp ứng,danh sách tổng hợp
sẽ gọi chính nó. Đây là sự đệ quy của hàm đệ quy và lý do tại sao nó được gọi là hàm đệ quy.
Trong hình (a) bên dưới, bạn có thể thấy rằng giải pháp [1, 2, 3, 4, 5]
kịp thờicuộc gọi đệ quy
thủ tục, mỗi lệnh gọi đệ quy sẽ giải quyết một vấn đề gần với trường hợp cơ bản hơn cho đến khi vấn đề không thể đơn giản hóa hơn nữa.
Khi không thể đơn giản hóa bài toán, hãy bắt đầu ghép lời giải của tất cả các bài toán con. Hình (b) bên dưới thể hiện hàm đệ quy. danh sách tổng hợp
Thao tác cộng được thực hiện khi trả về kết quả của một loạt cuộc gọi, khi được trả về mức cao nhất sẽ giải quyết được vấn đề ban đầu.
Tháp Hà Nội (Tháp Hà Nội
) là một câu đố rất cổ điển. Nó bao gồm ba tòa tháp và nhiều đĩa có kích thước khác nhau có thể di chuyển đến bất kỳ cột nào. Bắt đầu với các đĩa được sắp xếp trên một tháp theo thứ tự kích thước tăng dần, với đĩa trên cùng là nhỏ nhất và đĩa dưới cùng là lớn nhất. Mục tiêu của câu đố là di chuyển các đĩa xếp chồng lên nhau sang một cột khác, tuân theo các quy tắc sau:
Tiếp theo chúng tôi giải thích cách sử dụng tháp trung gian phụ trợ
, thay đổi chiều cao thành N
một chồng đĩa từ tháp xuất phát Nguồn
Di chuyển đến đích tháp Điểm đến
:
Điểm đến
, di chuyển phần trên cùng n-1
đĩa từ Nguồn
di chuyển đến phụ trợ
;N
đĩa từ Nguồn
Tháp di chuyển đến tháp cuối Điểm đến
;Nguồn
tháp, ý chí n-1
đĩa từ tháp phụ phụ trợ
Di chuyển đến tháp đích Điểm đến
.Bạn có thể thực hiện đệ quy các bước trên miễn là tuân thủ các quy tắc di chuyển Tháp Hà Nội. Tháp đơn giản nhất của Hà Nội là tháp chỉ có một tấm, trong trường hợp đó chỉ cần di chuyển tấm này đến cột cuối Điểm đến
Vậy đó, đây là tình huống cơ bản. Các bước đệ quy trên sẽ giảm dần độ cao bằng cách N
Chúng ta hãy tiến gần hơn đến tình huống cơ bản, như trong hình bên dưới:
Chìa khóa của thuật toán là thực hiện hai lệnh gọi đệ quy. Lần đệ quy đầu tiên là loại bỏ tất cả trừ đĩa cuối cùng khỏi đĩa. Nguồn
Tháp chuyển sang tháp phụ phụ trợ
. Sau đó di chuyển đĩa cuối cùng đến tháp cuối Điểm đến
. Đệ quy thứ hai là di chuyển đĩa từ phụ trợ
di chuyển đến Điểm đến
:
def towerOfHanoi(số, nguồn=1, đích=3, phụ=2): nếu số >= 1: towerOfHanoi (số - 1, nguồn, phụ, đích) print("Di chuyển đĩa %d từ tháp %d sang tháp % d" % (số, nguồn, đích)) thápOfHanoi (số - 1, phụ, đích, nguồn) towerOfHanoi(number=3)
Đầu ra của chương trình trông như thế này:
Di chuyển đĩa 1 từ tháp 1 sang tháp 3 Di chuyển đĩa 2 từ tháp 1 sang tháp 2 Di chuyển đĩa 1 từ tháp 3 sang tháp 2 Di chuyển đĩa 3 từ tháp 1 sang tháp 3 Di chuyển đĩa 1 từ tháp 2 sang tháp 1 Di chuyển đĩa 2 từ tháp 1 sang tháp 3 2 tới tháp 3 Di chuyển đĩa 1 từ tháp 1 sang tháp 3
Tôi đang làm việc với một tập hợp 173k điểm được dán nhãn là 160 nhóm. Tôi muốn giảm số lượng nhóm/cụm bằng cách hợp nhất những nhóm gần nhất (xuống còn 9 hoặc 10 nhóm). Tôi đã tìm kiếm sklearn hoặc các thư viện tương tự nhưng không thành công. Tôi đoán nó chỉ phân cụm qua knn
Tôi có một danh sách phẳng gồm các số được nhóm hợp lý thành nhóm 3, trong đó mỗi bộ ba là (số, __bỏ qua, cờ [0 hoặc 1]), ví dụ: [7,56,1, 8,0, 0, 2 ,0,0, 6,1,
Tôi đang sử dụng pipenv để quản lý các gói của mình. Tôi muốn viết một tập lệnh python để gọi một tập lệnh python khác bằng môi trường ảo khác (VE). Cách chạy python script 1 bằng VE1 và gọi p khác
Giả sử tôi có tệp script.py nằm ở path = "foo/bar/script.py". Tôi đang tìm cách truyền hàm exec_script() bằng Python từ Python chính của tôi
Điều này nghe có vẻ như một câu đố hay một trò đùa, nhưng thực sự tôi vẫn chưa tìm ra câu trả lời cho câu hỏi này. Vấn đề chính xác là gì? Tôi muốn chạy 2 tập lệnh. Trong tập lệnh đầu tiên, tôi gọi một tập lệnh khác, nhưng tôi muốn chúng tiếp tục song song chứ không phải theo hai luồng riêng biệt. Chủ yếu là vì tôi không muốn
Tôi có một phần mềm với python 2.5.5. Tôi muốn gửi lệnh sẽ khởi động tập lệnh trong python 2.7.5 và sau đó tiếp tục thực thi tập lệnh. Tôi đã thử sử dụng #!python2.7.5 và http://re
Tôi đang sử dụng dòng lệnh python (sử dụng python 2.7) và đang cố chạy tập lệnh Python. Hệ điều hành của tôi là Windows 7. Tôi đã đặt thư mục của mình vào thư mục chứa tất cả các tập lệnh của mình bằng cách sử dụng: os.chdir("
Tiết lộ nội dung: Đã giải quyết được một phần (xem phần cuối). Đây là một ví dụ về mã sử dụng tính năng nhúng Python: #include int main(int argc, char** argv) { Py_SetPythonHome
Giả sử tôi có danh sách sau, tương ứng với giá cổ phiếu tại các thời điểm: giá = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4 , 11] Tôi muốn xác định điều nào sau đây nói chung là phù hợp nhất
Vì vậy, tôi đang cố gắng thay đổi nền của khung này khi một nút radio nhất định được chọn. Khung của tôi thuộc một lớp và chức năng của các nút radio nằm ngoài lớp đó. (Bằng cách này tôi có thể gọi chúng trên tất cả các khung khác.) Vấn đề là bất cứ khi nào tôi chọn nút radio, tôi đều gặp lỗi sau: co
Tôi đang cố gắng so sánh một chuỗi với một biểu thức chính quy trong python như sau, #!/usr/bin/env python3 import re str1 = "Expecting property name
Hãy xem xét mô-đun Boost.Python nguyên mẫu sau đây, mô-đun này nhập lớp "D" từ tệp tiêu đề C++ riêng biệt. /* tập tin: a/b.cpp */ BOOST_PYTHON_MODULE(c)
Làm cách nào để viết chương trình để "xác định số dòng của lệnh gọi hàm?" Mô-đun kiểm tra python cung cấp tùy chọn để xác định số dòng, tuy nhiên, def di(): return Inspection.currentframe().f_back.f_l
Tôi đã cài đặt Python 2.7 bằng macports và do biến $PATH của tôi, đây là những gì tôi nhận được khi nhập $python. Tuy nhiên, virtualenv sử dụng Python 2.6 theo mặc định, ngoại trừ
Tôi chỉ muốn hỏi làm thế nào để tăng tốc độ nghiên cứu trên python. Tôi có một dòng chuỗi dài có độ dài 176861 (tức là các ký tự chữ và số có một số ký hiệu) và tôi đã kiểm tra dòng này bằng hàm này để nghiên cứu: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
Câu hỏi này đã có câu trả lời ở đây: Pythonic có sử dụng khả năng hiểu danh sách chỉ cho các tác dụng phụ không? (7 câu trả lời) Đã đóng 4 tháng trước. kể
Tôi muốn kết hợp hai danh sách thành một danh sách bằng Python như sau: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright ", "Tháng Sáu","và" ,"Ju
Tôi đang chạy Mac OS X 10.8.4 (Darwin 12.4.0) với bản phát hành Boost mới nhất (1.55.0). Tôi đang làm theo hướng dẫn ở đây để xây dựng hướng dẫn Boost-Pyth đi kèm với bản phân phối của tôi
Đang học Python, tôi đang cố gắng tạo một công cụ quét web mà không cần bất kỳ thư viện của bên thứ 3 nào để quy trình này không được sắp xếp hợp lý đối với tôi và tôi biết mình đang làm gì. Tôi đã xem một số tài nguyên trực tuyến nhưng tất cả chúng đều khiến tôi bối rối về điều gì đó. ngoại hình html
Tôi là một lập trình viên xuất sắc, rất giỏi!