func P(_ n:Int,_ k:Int)->Int{return n*k>0 ?P(n-k,k)+P(n-1,k-1):n==k ?1:0}
オンラインでお試しください!
説明
コードはどのように構造的に機能しますか?
まず、P2つの整数パラメーターnとを使用して関数を定義し、次のコード部分を使用しkて戻り型を指定します。ここでのクールなトリックは、パラメーターの名前を無視するようにコンパイラーに指示し、その後にスペースを続けることです。これにより、関数を呼び出すときに2バイト節約されます。明らかに、以下で説明するネストされた三項の結果を返すために使用されます。Intfunc 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になるまでループします。
* 注:スペースは削除できません。