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 n
dan 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. return
jelas 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 n
dikurangi oleh k
sebagai yang baru n
dan k
tetap sama, dan kami menambahkan hasil P()
dengan n
dan k
dikurangi dengan 1. Jika kondisi tersebut tidak benar , kami mengembalikan salah satu 1
atau 0
bergantung pada apakah n
sama 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 P
dua kali secara rekursif , menambahkan hasil P(n-k,k)
dan P(n-1,k-1)
. Dan kita mengulang lagi sampai n
mencapai 0.
* Catatan: Spasi tidak dapat dihapus.