2016-04-17 9 views
0

次のような問題を考えてみてください。私は、特定の順列シグマを持っている:順列:生産サイクル表記

sigma = [4,1,6,2,3,5] 

所望の結果は次のサイクルの表記を生成することである。

my_cycles_perm = [[4,2,1],[6,5,3]] 

私の試みが行きます次のコードに従って、しかし、私は最初のサイクルまでしか到達しないようですが、2番目のサイクルに再エンゲージメントすることはできません:

my_row_cycle関数の背後にあるアイデアあるパーミュテーションのシグマを取って、マーカー(マーカー== 0のときに閉じられるcrcuit)という一種の回路ブレーカを設定し、サイクルが完了するまで順列を繰り返します。サイクルが完了すると、それをリストに格納します。

次に、前に抽出されたサイクルに含まれていないシグマの数字が見つかるまで、シグマを繰り返し繰り返して順列から抽出する他のサイクルがあるかどうかを確認します。そのような番号が見つかった場合は、プロセスを再開します。そうでない場合は、回路ブレーカをトリップして、マーカ== 1にして、プロセス全体を終了し、シグマ順列のサイクル表記を出力します。

しかし、これはまだ私にとってはユートピアのようです。 :)

def my_row_cycle(sigma): 
    aux_sigma = list(sigma) 
    init_ref = aux_sigma.index(aux_sigma[0]) +1  #First antecedent of aux_sigma 
    init_image = aux_sigma[init_ref-1]    #Image of the antecedent 
    jumper_image = init_image 
    row_cycle = [] 
    row_cycle.append(init_image) 
    my_cycles_perm = [] 

    marker = 0 

    while marker == 0:         #Circuit breaker 
     while jumper_image != init_ref:    #establishes if cycle complete 
      for x in aux_sigma:      #iterates sigma while cycle incomplete 
       jumper_ref = aux_sigma.index(x) + 1 
       if jumper_ref == jumper_image:   #Condition to append to cycle 
        row_cycle.append(x) 
        jumper_image = x     #Changing the while loop condition 
     my_cycles_perm.append(row_cycle) 

     for a in aux_sigma: 
      for a in my_cycles_perm: 
       cycle = a 
       for a in cycle:     #looking for match in aux_sigma and cycle 
        if a not in cycle: 
         row_cycle = [] 
         init_image = a 
         init_ref = aux_sigma.index(init_image) + 1 
         marker = 0 
         break 

        else: 
         marker = 1 

return init_ref, init_image, jumper_image, jumper_ref, row_cycle, marker, my_cycles_perm 

評価後:

(1, 4, 1, 6, [4, 2, 1], 1, [[4, 2, 1]]) 

私は値が「1」と、まだ私のサイクル表記に私のマーカー旅行が不完全である理由を理解するように見えることはできません。 提案や修正があれば、事前に感謝します。あなたが誤ってあなたのネストされたループ内の変数aを複数回使用しているため

+1

あなたは人々があなたのコードをデバッグする場合は、おそらくあなたのコードをコメントとロジックにあなたを説明することによって、それらにできる限り素敵なことを試してみてくださいフォローしようとしている。 – Julien

+0

あなたは正しいです、私は過去1日間それまででしたし、疲れていて、挫折している間に午前2時に質問を投稿しました(私は知っています...)。私は数日前からプログラミングを始めていましたが、これにもかかわらず私のコードにコメントすることの有用性については知らなかったので、あなたから何かを学んだことに感謝します!とにかく、編集された投稿と将来の質問のために撮影されたメモ。 – Yann1123

答えて

0

それは次のようになります。

for a in aux_sigma : 
    for a in my_cycles_perm : 
     cycle = a 
     for a in cycle :  # <<-- a iterates ovr cycles, so 
      if a not in cycle : # <<-- a in cycle is alsways true 
       # [...] 
       marker = 1 
      else : 
       marker = 0 

は、すべての個別の反復に別々の変数名を割り当てます。

+0

助けてくれてありがとう、私はこれらの変数はリンクされていないと思ったが、機能には私はそれにもかかわらず何の結果も得られないようだ。 – Yann1123

1

私は、この関数はあなたが望む何を信じて:

def to_cycles(perm): 
    pi = {i+1: perm[i] for i in range(len(perm))} 
    cycles = [] 

    while pi: 
     elem0 = next(iter(pi)) # arbitrary starting element 
     this_elem = pi[elem0] 
     next_item = pi[this_elem] 

     cycle = [] 
     while True: 
      cycle.append(this_elem) 
      del pi[this_elem] 
      this_elem = next_item 
      if next_item in pi: 
       next_item = pi[next_item] 
      else: 
       break 

     cycles.append(cycle) 

    return cycles 

print(to_cycles([])) 
# [] 

print(to_cycles([1])) 
# [[1]] 

print(to_cycles([4,1,6,2,3,5])) 
# [[4, 2, 1], [6, 5, 3]]