最初の行では、我々は書きます 0
。今、すべての次の行に、我々は前の行を見て、それぞれの出現置き換える 0
と 01
、そしてそれぞれの出現 1
とを 10
。
行所定の N
インデックス K
、戻り K
列に番目のインデックス付け記号 N
。(の値が K
1のインデックス付きである。)(1索引付け)。
例: 入力:N = 1、K = 1つの 出力:0 入力:N = 2、K = 1つの 出力:0 入力:N = 2、K = 2 出力:1つの入力:N = 4、K = 5 出力:1 説明:行1:0行2:01行3:0110行4:01101001
ノードが0である場合、全体の構造は、その二人の子供のノードが、0と1であり、バイナリツリーを見ることができる
二人の子供のノードが1と0であり、ノードが1の場合、同様に
我々は、Kの位置であるか否かを知ることができます左ノードまたは2を分割して右ノード
Kが偶数の場合は、現在のノードが右の子であり、その親が前行のノード目(K / 2)です。
Kが奇数の他の場合、現在のノードが子を残しており、その親は、前の行のノード目((K + 1)/ 2)です。
現在のノードの値は、その親ノードの値を知らなくても、その親ノードに依存して
、我々はまだ現在のノードの値を決定することはできません。
それは我々が再帰を必要とする理由、我々は最初の行に到達するまで、親ノードを見つけるために、前の行を続けるのです。
そして、すべての親ノード値は、再帰関数が戻った後に決定されます。
クラス解決{ パブリック: INT kthGrammar(INT N、INT K){ 場合(N == 1)戻り 0 ; もし(K%2 == 0)リターン(kthGrammar(N - 1、K / 2)== 0)?1:0 。 他の リターン(kthGrammar(N - 1、(K + 1)/ 2)== 0)?0:1; } }。