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}
Cobalah online!
Penjelasan
Bagaimana cara kerja kode secara struktural?
Pertama-tama, kita mendefinisikan fungsi kita P, dengan dua parameter bilangan bulat ndan k, dan memberikan jenis kembalinya Int, dengan potongan kode ini: func P(_ n:Int,_ k:Int)->Int{...}. Trik keren di sini adalah bahwa kita memberi tahu kompiler untuk mengabaikan nama-nama parameter, dengan _diikuti oleh spasi, yang menyelamatkan kita dua byte ketika kita memanggil fungsi. returnjelas digunakan untuk mengembalikan hasil terner bersarang kami yang dijelaskan di bawah ini.
Trik lain yang saya gunakan adalah n*k>0, yang menyelamatkan kita beberapa byte n>0&&k>0. Jika kondisinya benar (kedua bilangan bulat masih lebih tinggi dari 0), maka kami secara rekursif memanggil fungsi kami dengan ndikurangi oleh ksebagai yang baru ndan ktetap sama, dan kami menambahkan hasil P()dengan ndan kdikurangi dengan 1. Jika kondisi tersebut tidak benar , kami mengembalikan salah satu 1atau 0bergantung pada apakah nsama dengan k.
Bagaimana cara kerja algoritma rekursif?
Kita tahu bahwa elemen pertama dari urutan adalah p 0 (0) , dan kami memeriksa bahwa kedua bilangan bulat positif ( n*k>0). Jika mereka tidak lebih tinggi dari 0, kami memeriksa apakah mereka sama ( n==l ?1:0), di sini menjadi dua kasus:
Tepat ada 1 partisi yang mungkin, dan dengan demikian kita mengembalikan 1, jika bilangan bulat sama.
Tidak ada partisi jika salah satunya sudah 0 dan yang lainnya belum.
Namun, jika keduanya positif, kami memanggil Pdua kali secara rekursif , menambahkan hasil P(n-k,k)dan P(n-1,k-1). Dan kita mengulang lagi sampai nmencapai 0.
* Catatan: Spasi tidak dapat dihapus.