次のような問題を考えてみてください。私は、特定の順列シグマを持っている:順列:生産サイクル表記
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
を複数回使用しているため
あなたは人々があなたのコードをデバッグする場合は、おそらくあなたのコードをコメントとロジックにあなたを説明することによって、それらにできる限り素敵なことを試してみてくださいフォローしようとしている。 – Julien
あなたは正しいです、私は過去1日間それまででしたし、疲れていて、挫折している間に午前2時に質問を投稿しました(私は知っています...)。私は数日前からプログラミングを始めていましたが、これにもかかわらず私のコードにコメントすることの有用性については知らなかったので、あなたから何かを学んだことに感謝します!とにかく、編集された投稿と将来の質問のために撮影されたメモ。 – Yann1123