2013-04-03 19 views
6

PARI/GP'de her seviyede birden çok satıra sahip iç içe döngüler nasıl yapabilirim? Sıklıkla döngüler için birçok şeyi yapmak zorundayım ve okunabilirlik için döngülerimi tek bir satırda yazmaktan hoşlanmıyorum. tek değişkenli üzerinde bir döngü için, ben bu işi yapıyorum: PARI/GP'de döngüler için çok satırlı yuvalar nasıl oluşturulur?

for(i=1,10,{ 
    printf("%u\n",i); 
}) 

Ancak, iç içe döngüler için sadece bir seviyede bir satır sonu koymak başardınız. Bu çalışır:

for(i=1, 10, for(j=1, 10, { 
    printf("%2u\t%2u\n", i, j); 
})); 

Bu aynı zamanda çalışır: Ancak

for(i=1, 10, { 
    for(j=1, 10, printf("%2u\t%2u\n", i, j)); 
}); 

, bu gerçekten yapmak istiyorum şudur:

for(i=1, 10, { 
    for(j=1, 10, { 
      printf("%2u\t%2u\n", i, j); 
    }); 
}); 

Bu son örnek çalışmaz; Bir hata verir:

*** sorry, embedded braces (in parser) is not yet implemented. 
... skipping file 'nested_for.gp' 
    *** at top-level: printf("%2u\t%2u\n", 
    ***     ^-------------------- 
    *** printf: not a t_INT in integer format conversion: i. 
    *** Break loop: type 'break' to go back to GP 

OS X 10.8.3'de PARI/GP 2.5.3 kullanıyorum. Komut dosyalarını nested_for.gp dosyasına yazıp Bash'te gp ./nested_for.gp kullanarak çalıştırıyorum.

cevap

9

C-benzeri sözdiziminden beklediklerimizin aksine, parantezler GP'de bir blok tanımlamaz. Sadece bir dizi talimatı çoklu ardışık satırlarda ayırmaya izin verirler. Yuvalamazlar; Diğer taraftan ise, yuva tek {} blok içinde döngüler olabilir:

{ 
    for (i = 1, 10, 
    for (j = 1, 10, 
     print (i+j))) 
} 

Çok hatlı komutları, genellikle kullanıcı işlevlerinde bulunan ve böyle bir bağlamda daha doğal görünebilir:

fun(a, b) = 
{ 
    for (i = 1, a, 
    for (j = 1, b, 
     print (i+j))); 
} 
+0

Yığın Taşması'na Hoş Geldiniz ve çok teşekkür ederim. –

+0

PS. Kod bloklarının her birinde ikinci for döngüsünde virgül olması gerektiğini düşünüyorum. Aksi halde bu harika çalışıyor. –

+0

Verilen. Sadece parçacıkları düzeltildi! –

İlgili konular