func P(_ n:Int,_ k:Int)->Int{return n*k>0 ?P(n-k,k)+P(n-1,k-1):n==k ?1:0}
オンラインでお試しください!
説明
コードはどのように構造的に機能しますか?
まず、P
2つの整数パラメーターn
とを使用して関数を定義し、次のコード部分を使用しk
て戻り型を指定します。ここでのクールなトリックは、パラメーターの名前を無視するようにコンパイラーに指示し、その後にスペースを続けることです。これにより、関数を呼び出すときに2バイト節約されます。明らかに、以下で説明するネストされた三項の結果を返すために使用されます。Int
func P(_ n:Int,_ k:Int)->Int{...}
_
return
私が使用したもう1つのトリックはn*k>0
、数バイトを節約することでしたn>0&&k>0
。条件は(整数の両方がまだ高いよりも真である場合0
)、その後、我々は再帰的に私たちの関数を呼び出すn
だけ減少k
など私たちの新しいn
とk
滞在同じ、と私たちはその結果を追加するP()
とn
し、k
条件が真でない場合は1ずつ減少します、1
また0
はがにn
等しいかどうかに応じて、どちらかを返しますk
。
再帰アルゴリズムはどのように機能しますか?
シーケンスの最初の要素がp 0(0)であることを知っているので、両方の整数が正(n*k>0
)であることを確認します。それらが0以下の場合、それらが等しい(n==l ?1:0
)かどうかをチェックします。
両方が正である場合は、我々は再帰呼び出しP
の結果を加算し、二回P(n-k,k)
とP(n-1,k-1)
。そして、n
が0になるまでループします。
* 注:スペースは削除できません。