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 nvà 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. returnrõ 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ố ngiảm klà mới nvà kgiữ nguyên, và chúng ta thêm kết quả của P()với nvà kgiảm xuống bằng 1. Nếu điều kiện không đúng , chúng tôi trả lại 1hoặc 0tùy thuộc vào việc ncó 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 Phai 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ỏ.