2012-12-09 17 views
6

Python'da iç içe geçmiş listelerin bir listesini oluşturacak basit bir özyinelemeyi yapmaya çalışıyorum. Son sonuç, tek bir eleme turnuvası dirseğini temsil edecektir. Bunun gibi bir liste oluşturmanın, ihtiyacım olan şeyi üretmemi kolaylaştıracağını umuyorum. Bu daha sonra turnuva maçları için modeller oluşturmak için kullanılacaktır.Python'da bir köşeli model listesi oluşturmak için algoritma

Yani 4 katılımcıdan oluşan turnuva varsa: 7 katılımcı

[[1,4],[2,3]] 

Turnuva:

[[1,[4,5]],[[2,7],[3,6]]] 

Veya 8 katılımcı turnuva:

[[[1,8],[4,5]],[[2,7],[3,6]]] 

Ben cenneti' Henüz bir algoritma sınıfına sahiptim (sınıfın bunun gibi şeylerle sonuçlanacağını umuyorum) bu yüzden tamamen değilim. Bu soruna nasıl yaklaşacağınızdan emin olabilirsiniz. Aşağıda benim girişimi şimdiye kadar.

def decide_rounds(list_to_fill, player_nums): 
    if len(player_nums) < 3: 
     for num in player_nums: 
      list_to_fill.append(num) 
     return 

    left = [] 
    decide_rounds(left, ??????) #Tried passing various things to these with no avail. 
    list_to_fill.append(left) 
    right = [] 
    decide_rounds(right, ???????) 
    list_to_fill.append(right) 

Buna nasıl yaklaşacağınız konusunda herhangi bir yardım veya açıklama büyük ölçüde takdir edilecektir!

Düzenleme:

rounds = [] 
decide_rounds(rounds, range(1, size +1)) 
print rounds 
+3

Dene: http://ideone.com/RVe8SQ – irrelephant

+2

@irrelephant mutlaka bunun bir cevabı yerine bir açıklama olmalıdır? –

+0

@irrelephant Burada 16 oyuncu var: http://pastebin.com/sTT07iCj Orijinal cevabınız, doğru sırayla bir liste verilmişse, belki de bir tür basit bir işlevle çözülebilecek bir şekilde çalışıyorsa çalışır. – computmaxer

cevap

6

bu deneyin: Şu anda böyle fonksiyon arıyorum

def divide(arr, depth, m): 
    if len(complements) <= depth: 
     complements.append(2 ** (depth + 2) + 1) 
    complement = complements[depth] 
    for i in range(2): 
     if complement - arr[i] <= m: 
      arr[i] = [arr[i], complement - arr[i]] 
      divide(arr[i], depth + 1, m) 

m = int(raw_input()) 

arr = [1, 2] 
complements = [] 

divide(arr, 0, m) 
print arr 

Biz 2^n oyuncularla ayraç, her çiftin toplamı olduğunu fark aynı numara. Her bir çift için, doğru terim sol eleman ve özyinenin derinliği tarafından belirlenir, bu yüzden ilk önce dizi derinliğini oluşturarak ilerleyebiliriz. Çalışma zamanını iyileştirmek için tamamlayıcıları bir parça not alıyoruz. Tamamlayıcı çok büyük olduğunda yinelemeyi durduğu için, herhangi bir m > 1 için çalışır.

görün Yürüt: http://ideone.com/26G1fB

+0

Teşekkür ederiz! Bu tam olarak istediğimi yapar. Açıklama anlamlıdır. Muhteşem. – computmaxer

+0

Bu algoyu biraz açıklar mısınız? Ya da burada neler olduğuna dair bir açıklamaya bakabileceğim bir yer var mı? Ne olduğunu tam olarak anlamakta sorun yaşıyorum :) – AndrewD

İlgili konular