Swift , 76 73 byte
func P(_ n:Int,_ k:Int)->Int{return n*k>0 ?P(n-k,k)+P(n-1,k-1):n==k ?1:0}
Hãy thử trực tuyến!
Giải trình
Làm thế nào để mã cấu trúc làm việc?
Trước hết, chúng tôi xác định hàm của chúng tôi P
, với hai tham số nguyên n
và k
, và cung cấp cho nó một kiểu trả về Int
, với đoạn mã này : func P(_ n:Int,_ k:Int)->Int{...}
. Thủ thuật thú vị ở đây là chúng ta bảo trình biên dịch bỏ qua tên của các tham số, _
theo sau là khoảng trắng, giúp chúng ta tiết kiệm hai byte khi chúng ta gọi hàm. return
rõ ràng là được sử dụng để trả về kết quả của ternary lồng nhau của chúng tôi được mô tả dưới đây.
Một mẹo khác tôi đã sử dụng là n*k>0
, giúp chúng tôi tiết kiệm được một vài byte n>0&&k>0
. Nếu điều kiện là đúng (cả hai số nguyên vẫn cao hơn 0
), thì chúng ta gọi đệ quy hàm của chúng ta với số n
giảm k
là mới n
và k
giữ nguyên, và chúng ta thêm kết quả của P()
với n
và k
giảm xuống bằng 1. Nếu điều kiện không đúng , chúng tôi trả lại 1
hoặc 0
tùy thuộc vào việc n
có bằng không k
.
Thuật toán đệ quy hoạt động như thế nào?
Chúng ta biết rằng phần tử đầu tiên của chuỗi là p 0 (0) và vì vậy chúng tôi kiểm tra cả hai số nguyên đều dương ( n*k>0
). Nếu chúng không cao hơn 0, chúng tôi kiểm tra xem chúng có bằng ( n==l ?1:0
) không, đây là hai trường hợp:
Có chính xác 1 phân vùng có thể, và do đó chúng ta trả về 1, nếu các số nguyên bằng nhau.
Không có phân vùng nếu một trong số chúng là 0 và cái còn lại thì không.
Tuy nhiên, nếu cả hai đều tích cực, chúng tôi gọi đệ quy P
hai lần, thêm kết quả của P(n-k,k)
và P(n-1,k-1)
. Và chúng tôi lặp lại một lần nữa cho đến khi n
đạt 0.
* Lưu ý: Không gian có thể được loại bỏ.