'Loop' olmadan döngü [kapalı]


85

Buna benzer bir soru birkaç yıl önce soruldu , ancak bu daha zorlu.

Zor olan basittir. Defalarca gibi herhangi tekrarlama yapıları kullanmadan kod çalıştırır (seçtiğiniz dilde) bir program yazın while, for, do while, foreachveya goto( tüm nitpickers için Yani, bir döngü kullanamazsınız ). Ancak, tekrar eden fonksiyona, kendi kendine çağrı işlevinde izin verilmez (aşağıdaki tanıma bakınız) . Bu, bu zorluğu çok kolaylaştıracaktır.

Döngüde nelerin yapılması gerektiğine dair bir kısıtlama yoktur, ancak cevabınızla ilgili bir açıklama yapın, böylece başkalarının tam olarak neyin uygulandığını anlayabilmesini sağlayabilirsiniz.

Tanımlara asılabilir olanlar için, bu soru için bir döngü tanımı şöyledir:

A programming language statement which allows code to be repeatedly executed.

Ve bu soru için özyinelemenin tanımı, standart özyinelemeli işlev tanımınız olacaktır:

A function that calls itself.

Kazanan, 16 Temmuz günü saat 10.00’da Doğu’da en fazla oyu alan cevap olacak. İyi şanslar!

GÜNCELLEME:

Hala ifade edilmekte olan karışıklığı sakinleştirmek yardımcı olabilir:

Yukarıda belirtilen kurallar:

  • Döngü veya goto kullanmayın
  • İşlevler kendilerini arayamaz
  • 'Döngüde' ne istersen yap

Bir şeyi uygulamak istiyorsan ve kurallar açıkça yasaklamıyorsa, devam et ve yap. Pek çok cevap, kuralları çoktan eğmiştir.


27
Kolayca bir numara isteyenler için, onu rahatsız etmekten rahatsız olamam: P Fonksiyonlardan 1'i bir şey yaparken sadece 2 fonksiyon yapın, function Açağrılar yapın function Bve function Bçağrılar yapın function A. İşlev kendisini çağırmadığından, ^. ^
Teun Pronk

2
“Yaratıcılığa odaklanmak için popülerlik yarışması değişti” sorusunu değiştirmek hile yapmak!
Kuzen Kokain

4
"Özyinelemenin" tanımı çok kullanışlı değil. Doğrudan veya dolaylı olarak kendilerine başvuran işlevler olan özyinelemeli işlevlere izin vermemek daha iyi olacaktır .
05

3
Net olmayan şey, döngü yapıcısının ve özyinelemenin "tanımları" dır. Hiçbiri çok kesin değil. Örnek: rep(f){f();f();}- bu bir koddur (işlev bildirimi bazı dillerde bir ifadedir), art arda kod çalıştırmaya izin verir. İzin verilmedi mi? Bir döngü uygulamak için kod istersiniz. Bu kod sözdizimsel olarak bir deyimse, buna izin vermediniz. Başka bir örnek: f(b) { b(); g(b); }; g(b) { f(b); }. fÖzyinelemeli bir işlev olduğunu söyleyebilirim (karşılıklı olarak özyinelemeli olarak g). İzin verilmedi mi?
06'da

3
Ben "ettiğimi @CailinP, kafayı bu soru değil berrak, objektif şartname sahip demektir:" sitesinde sorular sitesi için konu üzerinde olması gerektiğidir.
Peter Taylor

Yanıtlar:


258

Yakut

def method_missing(meth,*args)
  puts 'Banana'
  send(meth.next)
end

def also
  puts "Orange you glad I didn't say banana?"
end

ahem

gösteri

Boğazını temizler, "Muz" u 3070 kez basar ve ayrıca "Turuncu, muz demediğime sevindin mi?" Koyar.

Bu, Ruby'nin 'ahem' ve 'ayrıca' ("ahem", "ahen", "aheo", "ahep", "aheq" sözcükleri arasındaki alfabetik olarak tanımlayan her yöntemi tanımlamak için tam zamanlı yöntem tanımı işlevini kullanır, "aher", "ahes", "ahet", "aheu", "ahev" ...) önce Muz'u yazdırmak ve sonra listedeki bir sonraki kişiyi aramak.


4
Sonunda tanımlanan ve aynı zamanda eksik olan "ayrıca" isabet eder.
histocrat

77
Bu histeriktir.
Michael B,

4
@ barrycarter: Ruby'de, bir sayıya 1 eklemek gibi işlevler String#nextolarak adlandırılan method_missingaşağı yukarı tüm işlevler (ve yalnızca dizedeki tek karakterler ise, alnümerik olmayan karakterler hariç). Bkz ruby-doc.org/core-2.1.2/String.html#method-i-next
3Doubloons

2
@NickT, yalnızca tarafından herhangi bir etiketi oluşturabileceğiniz XML yapıcıları gibi sınıflarda kullanılabilir b.my_tag. Ayrıca ActiveRecord modellerinde veya kullanılır OpenStruct. 'Wat talk' da küreselin method_missingkötü olduğunu, ancak kapsamın muhteşem olduğunu söyledi.
Hauleth

2
Başka bir yakut program hakkında eski bir yorumu hatırlıyorum: "Bunu sevdiğim için sevdim"
vidya sagar

82

Python - 16

veya eval ile birlikte başka bir dilde.

exec"print 1;"*9

Programınızın ne yaptığını açıklayabilir misiniz?
CailinP

10
Bir dizge alır ( "print 1;"), onu 9 kez çoğaltır ( *9), sonra sonuç dizesini ( exec) çalıştırır . Aslında bir döngü olmadan kod yığınını yinelemek.
scragar

12
Dize çarpma için Yay!
Thane Brimhall

2
Değiştirmek Ayrıca Ruby çalışır execetmek eval veyaprint etmek echo.
Ajedi32

80

CSharp

Artık kod golf olmadığından ve insanlar bu programın bir şeyler yaptığını görebilmeleri için bir artış sayacı eklediğinden, kodu daha okunaklı bir şekilde genişlettim.

class P{
    static int x=0;
    ~P(){
        System.Console.WriteLine(++x);
        new P();
    }
    static void Main(){
        new P();
    }
}

(Lütfen bunu yapma lütfen).

Başlangıçta P, programdan çıkmaya çalıştığında Psınıfın yeni bir örneğini yaratan sonlandırıcıyı çağıran GC'yi çağırır , bu da temizlemeye çalıştığında Psonlandırıcıyı çağıran yeni bir tane oluşturur . .

Program sonunda ölür.

Düzenleme: Açıkçası bu ölmeden önce sadece yaklaşık 45k kez çalışır. GC'nin zorlu sonsuz döngümü nasıl çözdüğünü tam olarak bilmiyorum ama oldu. Kısa, anlaşılmadığı anlaşılıyor ve iş parçacığı yaklaşık 2 saniye süren işten sonra öldürüldü: https://stackoverflow.com/questions/24662454/how-does-a-garbage-collector-avoid-an -Sonsuz döngü-burada

Düzenleme2: Bunun özyinelemeye göre biraz fazla olduğunu düşünüyorsanız, benim diğer çözümümüzü düşünün: https://codegolf.stackexchange.com/a/33268/23300

Genel yöntemlerin yeniden düzenlenmesini kullanır, böylece çalışma zamanında sürekli olarak yeni yöntemler üretir ve terimdeki her yöntem yeni basılmış bir yöntemi çağırır. Ayrıca reference, çalışma zamanları bu yöntemler için kodu paylaşabildiğinden, tür parametrelerini kullanmaktan da kaçınırım . Bir valuetür parametresi ile çalışma zamanı yeni bir yöntem oluşturmaya zorlanır.


20
C # 'nın yıkıcıları olduğunu bile bilmiyordum. Bana öğretmek için + 1.
seequ

4
@Rare, öyle ama doğada belirleyici değiller ve bir programın yürütülmesi sırasında hiçbir zaman çağrılmazlar. Sanal yöntemin geçersiz kılınması olarak uygulanırlar, Finalizeböylece bazen çağrılırlar finalizer. Gerçek C #, IDisposabledesen kullanmanız gerekir .
Michael B,

Bir noktada meydana gelen bir zaman aşımı olduğu görülüyor. Döngününüzü durduran GC olduğunu düşünmüyorum, bunun yerine işletim sistemi programınızın sona ermesinin çok uzun sürdüğüne karar veriyor.
LVBen

Bence bu gerçekten işletim sistemi mutlaka programı öldürmek için karar verme zamanıdır. Program sonunda çağrılan çöp toplayıcı dişine, öldürülmeden önce ~ 2 saniye sabit bir süre verilir.
Michael B,

Bazı küçük değişikliklerle (programın bitmesine izin vermeyin, 1. P nesnesinin GC'ye bırakılması ve tekrar tekrar GC.Collect'i çağırın), süresiz olarak çalışmasını sağlayabilirim.
LVBen

53

Befunge

.

İyi eski Befunge, satırlar sarılırken hemen hemen 0 (boş bir yığından) 0 verir.


1
Ha! Ben böyle hileler seviyorum
CailinP

47

JS

(f=function(){ console.log('hi!'); eval("("+f+")()") })()

İşlev eğlenceli!

Kendisiyle aynı gövdeyle başka bir işlev oluşturan ve daha sonra onu çalıştıran bir işlev.

Yığın limitine ulaşıldığında ve her şey çöktüğünde sonunda hi gösterilecektir.

Feragatname: Tarayıcınızda yığın sınırına ulaşana kadar hiçbir şey yapamazsınız.


Ve bir tane daha, daha kötü :

function f(){ var tab = window.open(); tab.f = f; tab.f()}()

Bir pencereyi açan bir fonksiyon yaratır, daha sonra fonksiyonun bir kopyası olan pencerede bir fonksiyon yaratır ve çalıştırır.

Feragatname: Açılır pencerelerin açılmasına izin verirseniz, bunu bitirmenin tek yolu bilgisayarınızı yeniden başlatmak olacaktır.


5
Bu kesin kötülük;)
CailinP

28
@CailinP Oldukça eval.
seequ,

Sanırım fikinci işlevin sonunda özlüyorsun . Sonunda olmalı }f().
Chirag Bhatia - chirag64

2
Ne yazık ki, farkettim çünkü denedim. : P
Chirag Bhatia - chirag64

7
-1 - bu sadece özyinelemedir.
immibis

39

x86 montajı / DOS

    org 100h

start:
    mov dx,data
    mov ah,9h
    int 21h
    push start
    ret

data:
    db "Hello World!",10,13,"$"

Ters bir kuyruk özyinelemesi olmadığını söylemiş miydim ? Ben mi yaptım hanımefendi mor mor ejderhalar

Nasıl çalışır

retBir fonksiyondan döndürmek için kullanılan kullanıcı, (aslında, normal olarak, ilgili orada konur yığından dönüş adresini çıkar call) ve buna atlar. Burada her yinelemede push, geri dönmeden önce yığında giriş noktası adresi, böylece sonsuz bir döngü oluşturur.


Bunun montajda mümkün olup olmadığını merak ediyordum.
Ian D. Scott


1
Bunun bir kopyası olarak codegolf.stackexchange.com/a/34295/11259 numaralı telefonu arayacaktım , ama bunun aslında daha önceki bir cevap olduğunu görüyorum
Digital Trauma,

@ DigitalTrauma: Evet, girişimi yayınladıktan sonra fark ettim ama Madame Mim'in resmine ekliyorum. :-) Neyse ki bazı farklılıklar var (onun biraz daha karışık ve 32 bit Linux'ta çalışıyor, benimki DOS'ta düz bir şekilde çalınıyor ve başka bir zıplaması yok), eğer kimse bunu burada bırakmazsam.
Matteo Italia

@MatteoItalia Kafam karışmadı, sadece berbat;) (tho "eax, 4" de kafam karıştı, opcode boyut tablosunu bulamadım, bu yüzden sadece tahmin edilen boyuttaydım). Çalışma projem derlenirken çevrimiçi derleyicide yaptım, böylece korkunç görünüyor. "Start:" kullanarak harika bir fikir.
PTwr

37

Java

XKCD'den doğrudan

Yapıştırma

Bir ebeveyn ve çocuk arasında hiç bitmeyen bir avlanma oyunu!

Hedef CHILDolarak ayarlanır PARENTve hedef PARENTolduğunu CHILD. Ne zaman PARENTaramaları AIM, bunun örneğini atar BALLsınıfının ve onu yakalamak deyimi tarafından yakalanır. Catch ifadesi daha sonra PARENT.TARGET.AIMhedefin olduğu yeri çağırır CHILD. CHILDÖrneğin aynı işi yapar ve ebeveyne "topu geri atar".


3
Bu çizgi romanları severim!
Derek 朕

1
Top, ebeveyn ve çocuk arasında atılmış olsaydı daha iyi olurdu. Olduğu gibi, top her zaman aynı "kişi" tarafından atılır ve yakalanır.
Ajedi32

@ Ajedi32 Aslında ileri geri atıyor gibi görünüyor; Ebeveynler HEDEF çocuk, çocuğun hedefi ebeveyn. Amaç, topu fırlatan ve çocuğu hedef alan ve topu fırlatan ebeveyne denir, işaret döngüsü
Alex Coleman

12
@AlexColeman Bu kod, topu havaya fırlatan, yakalayan, daha sonra topu tekrar ebeveyne geri vermeden önce aynı şeyi yapan çocuğa teslim eden ebeveyne benzerdir.
Ajedi32,

11
TARGET.AIM(B);Yöntemdeki komut AIMözyinelemeli bir çağrıdır. Dolayısıyla bu, "işlevler kendilerini arayamaz" kuralını ihlal ediyor.
Theodore Norvell

31

Bash, 3 karakter

yes

evet, 'y' yi tekrar tekrar konsola döndürür

Düzenleme: Herkes bu satırı düzenlemeye teşvik edilir:

yes something | xargs someaction

(Olivier Dulac sayesinde)


1
Bu neden sürekli çalışmaya devam edecek? Sadece nedenini anlamaya çalışarak sorgulamıyorum.
Teun Pronk

2
@TeunPronk yes, evet sözcüğünü, ölene veya akış kapanana kadar basar bir bash komutudur. Ekrana yazıyorsa, siz öldürene kadar asla durmayacak. Yine de hile yapmak, çünkü aslında printf üzerindeki bir döngüden oluşan bir komut.
scragar

1
Diğer eğlenceli bir yesdöngü devam etmek için kullanmak daha eğlenceli olacaktır .
trlkly

3
@izkata: ama sonra şunları yapabilirsiniz:: yes something | xargs someactionözyineleme yok (hatta satır başına sadece 1 "bir şey", -n 1 ila xargs ekleyebilirsiniz). Xargs kullanmak, daha karmaşık davranışların önünü açar (evet çıktısı ile hiçbir ilgisi olmayanlar bile)
Olivier Dulac

4
@ scragar cevap vermeliydin yes.
daviewales

28

C, 35 karakter

main(int a,char**v){execv(v[0],v);}

Program kendini yürütür. Bunun özyineleme olarak kabul edilip edilmediğinden emin değilim.


4
@mniip Tail recursion, o zaman, eğer işlem düzeyinde uygulanırsa
Izkata

3
@ İzka Kuyruğu özyinelemesi hala özyinelemektir, ancak bu özyineleme değildir. Özyineleme, başka bir yinelemenin sona ermesini bekleyen bir işlev (veya bu durumda bir işlem) anlamına gelir. Bu durumda, execyeni işlemin orjinalini değiştirmesine neden olur, dolayısıyla sonunda geri dönecek ya da taşacak hiçbir çağrı yığını yoktur.
millinon

4
@millinon Optimizasyonu destekleyen bir dilde, kuyruk özyineleme exec, önceki işlemin yerine geçen çağrıya benzer şekilde, çağrı yığındaki önceki çağrıyı değiştirir. Bu da taşmaz.
Izkata

1
@millinon sadece süper bilgiçlik olmak ve Scheme programlama dilinde, bu tartışma artık dışarı sürüklemek, bu optimizasyon olan bir dil özelliği. Bu bir kuyruk-özyinelemeli çağrı yaparsanız, yorumlayıcı / derleyici bu özelliğe öyle sahiptir geçen yığın çerçevesini yeniden. Bunun nedeni, Scheme'in yerleşik döngü yapılarına sahip olmamasıdır, bu nedenle Scheme'de bir döngü uygulamanın tek yolu, kuyruk özyinelemesi yapmaktır ve yığın taşmalarını çok fazla döngülemeye çalışmaktan atarsanız, emmek isterdi :)
Ord

2
Soyulmayı istiyorsanız, Şema "kuyruk çağrısı optimizasyonuna" sahip değildir, "uygun kuyruk çağrısı" na sahiptir. Bir optimizasyon değildir, bu bir dil standardı için temel bir gerekliliktir ve izin verilememesi durumunda, bu nedenle "optimizasyon" (ya da özyinelemeyle ilgisi olan bir öneri) kesinlikle tavsiye edilmeyen bir terimdir.
Leushenko

28

C (GCC yerleşikleriyle birlikte - aynı zamanda clang ile de çalışıyor gibi)

  • Açık döngüler yok
  • Açık bir şekilde gitme
  • Özyineleme yok
  • Yığınla uğraşmak sadece eski moda güzeldi (çocuklar, bunu süpervizyon olmadan evde denemeyin):
#include <stdio.h>

void *frameloop (void *ret_addr) {
    void **fp;
    void *my_ra = __builtin_return_address(0);

    if (ret_addr) {
        fp = __builtin_frame_address(0);
        if (*fp == my_ra) return (*fp = ret_addr);
        else fp++;
        if (*fp == my_ra) return (*fp = ret_addr);
        else fp++;
        if (*fp == my_ra) return (*fp = ret_addr);
        else fp++;
        if (*fp == my_ra) return (*fp = ret_addr);
        return NULL;
    } else {
        return (my_ra);
    }
}

int main (int argc, char **argv) {
    void *ret_addr;
    int i = 0;

    ret_addr = frameloop(NULL);
    printf("Hello World %d\n", i++);
    if (i < 10) {
        frameloop(ret_addr);
    }
}

Açıklama:

  • main()ilk aramalar frameloop(NULL). Bu durumda __builtin_return_address(), geri dönecek adresi (in main()) almak için yerleşik kodu frameloop()kullanın. Bu adresi iade ediyoruz.
  • printf() döngüdüğümüzü göstermek için
  • şimdi bir frameloop()önceki aramanın dönüş adresini arayacağız. Mevcut iade adresinin yığınını araştırıyoruz ve bulduğumuzda önceki dönüş adresinin yerine geçiyoruz.
  • Sonra 2. frameloop()çağrıdan geri dönüyoruz. Ancak geri dönüş adresi saldırıya uğradığından main(), ilk çağrının geri dönmesi gereken noktaya geri dönüyoruz . Böylece bir döngüye gireriz.

Yığın içinde dönüş adresinin aranması elbette bir döngü olarak daha temiz olurdu, fakat herhangi bir döngü olmaması için birkaç yinelemeyi açtım.

Çıktı:

$ CFLAGS=-g make frameloop
cc -g    frameloop.c   -o frameloop
$ ./frameloop 
Hello World 0
Hello World 1
Hello World 2
Hello World 3
Hello World 4
Hello World 5
Hello World 6
Hello World 7
Hello World 8
Hello World 9
$ 

2
Güzel! Acaba bu fonksiyonlar neden C özelliğinin bir parçası değil? ;-D
Brian Minton

4
@BrianMinton Aslında setjmp()/ ile benzer bir şey başarılmalıdır longjmp(). Bunlar c standardında değil, standart kütüphanededir . Yığını bugün elle elle sıkmak gibi hissettim ;-)
Digital Trauma

@BrianMinton Benim tahminim, (donanım) platformunu bağımlı kılan CPU özelliklerinde olmasıdır. Ve yığın çerçevesi otomatik olarak oluşturulduğunda kullanmak oldukça tehlikelidir, AV'nin bu kod hakkında ağlaması durumunda şaşırmam. Bunu veya bunu x86 asm sürümleri için kontrol edin .
PTwr

27

Haskell

Aşağıdaki kod özyinelemeli bir işlev içermez (dolaylı olarak bile), döngüsel ilkel içermez ve yerleşik özyinelemeli işlev çağrısı yapmaz (yalnızca IOçıktısını ve ciltlemeyi kullanır ), ancak belirli bir işlemi kesin olarak tekrarlar:

data Strange a = C (Strange a -> a)

-- Extract a value out of 'Strange'
extract :: Strange a -> a
extract (x@(C x')) = x' x

-- The Y combinator, which allows to express arbitrary recursion
yc :: (a -> a) -> a
yc f =  let fxx = C (\x -> f (extract x))
        in extract fxx

main = yc (putStrLn "Hello world" >>)

Fonksiyon extractşey demiyor, ycsadece çağırır extractve mainsadece çağırır ycve putStrLnve >>özyinelemeli olmayan, hangi.

Açıklama: Hile özyinelemeli veri türünde Strange. Örnekte gösterildiği gibi, rasgele tekrarlamaya izin veren, kendisini tüketen özyinelemeli bir veri türüdür. İlk olarak, yazılmamış lambda matematiğinde extract xkendi kendine uygulamayı ifade eden temel yapı kurabiliriz x x. Ve bu, olarak tanımlanan Y birleştiricisinin oluşturulmasına izin verir λf.(λx.f(xx))(λx.f(xx)).


Güncelleme: Önerildiği gibi, yazılmamış lambda hesabında Y tanımına daha yakın olan bir değişken gönderiyorum :

data Strange a = C (Strange a -> a)

-- | Apply one term to another, removing the constructor.
(#) :: Strange a -> Strange a -> a
(C f) # x = f x
infixl 3 #

-- The Y combinator, which allows to express arbitrary recursion
yc :: (a -> a) -> a
yc f =  C (\x -> f (x # x)) # C (\x -> f (x # x))

main = yc (putStrLn "Hello world" >>)

3
Özyinelemeli fonksiyonlar yerine özyinelemeli veri yapıları ... güzel.
Yaklaşan yaklaşanlıkFish

6
Bu, tamamen işlevsel programlamaya ilgi duyan biri olarak kalbime yakın. Az önce Y-birleştiriciyi negatif olarak yinelenen bir veri türü ile nasıl yapacağınızı gösterdiniz. Bu nedenle toplam dillerin okun sağında yinelenen türleri olması ve gül ağaçlarına izin vermemesi gerekir. Güzel! Sadece bunu oylamak için burada bir hesap yaptım!
Jake,

Bağlamayı kaldırabilir letve tanımlayabilirsiniz yc f = extract $ C $ f.extract, çünkü letbağlama tartışmalı bir şekilde özyinelemeye izin veren bir dil özelliğidir (klasik let x = x in x). Bu aynı zamanda bazı karakterleri azaltır :)
Earth Engine

veya hattayc = extract . C . (.extract)
Earth Engine

@EarthEngine Doğru, sadece yapıyı orijinal tanımına yakın tutmak istedim Y.
Petr Pudlák

26

C ++

Aşağıdaki 10'dan "Patlamaya!" şablon metaprogramlama kullanarak.

#include <iostream>

template<int N>
void countdown() {
    std::cout << "T minus " << N << std::endl;
    countdown<N-1>();
}

template<>
void countdown<0>() {
    std::cout << "Blast off!" << std::endl;
}

int main()
{
    countdown<10>();
    return 0;
}

Klasik bir özyineleme örneği gibi görünebilir, ancak aslında en azından teknik olarak tanımınıza bağlı değildir. Derleyici on farklı işlev üretecektir . countdown<10>"T eksi 10" yazdırır ve ardından çağırır countdown<9>, ve böyle devam eder countdown<0>, "Patlama!" ve sonra döner. Kod tekrarladığınızda özyineleme gerçekleşir, ancak çalıştırılabilir döngü yapıları içermez.

C ++ 11'de constexpr, bu faktörsal işlev gibi anahtar kelimeyi kullanarak benzer etkiler elde edilebilir . (Geri sayım örneğini bu şekilde uygulamak mümkün değildir, çünkü constexprişlevlerin yan etkileri olamaz, ancak yaklaşan C ++ 14'te mümkün olabileceğini düşünüyorum.)

constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n-1));
}

Yine bu gerçekten özyineleme gibi görünüyor, ama derleyici dışarı genişleyecektir factorial(10)içine 10*9*8*7*6*5*4*3*2*1ve sonra muhtemelen sabit bir değerle değiştirir 3628800, böylece çalıştırılabilir herhangi döngü veya özyinelemeli kod içermeyecektir.


4
Bunlardan ikincisi, metaprogramlama değil , gerçekten saf ve basit özyinelemektir . Öncelikle, derleyici (genel durumda), sürekli olmayan argümanlarla kullanmanız için normal bir fonksiyon gövdesi yayacaktır; ve ikincisi, bir derleme zamanı işlemi gerçekleştirdiğinde, bu şablon stili "genişleme" işlemlerinden herhangi birini yapmazsa, standart bir yerinde değerlendirme yapar - çalışma zamanı ile aynıdır - 3628800doğrudan bir ara form
Leushenko

@Leushenko evet biliyorum. Ancak yine şablon örneği örneği aynı şeyi yapar - derleme zamanında Turing tamamlanmış bir dilde özyinelemeli bir işlev kullanır - tek fark constexpr'nin C ++ 'a çok daha benzeyen bir dil kullanmasıdır. Tüm cevaplarda olduğu gibi, bu kurallara uyuyor ve ben sadece dürüst davranıyorum. constexprözellikle şablon metaprogramlamanın modası geçmiş (bazı yönleri) yapmak için tasarlanmıştı, bu yüzden kesinlikle konuyla ilgili bir yazıdan bahsetmeye değer görünüyor.
Nathaniel,

1
+1: &countdown<N-1> != &countdown<N>.
Thomas Eding

21

Java

Java sınıf yükleyicisiyle oynayalım ve kendi ebeveyni olarak ayarlayalım:

import java.lang.reflect.Field;

public class Loop {
    public static void main(String[] args) throws Exception {
        System.out.println("Let's loop");
        Field field = ClassLoader.class.getDeclaredField("parent");
        field.setAccessible(true);
        field.set(Loop.class.getClassLoader(), Loop.class.getClassLoader());

    }
}

Bu döngü aslında o kadar güçlüdür ki kill -9onu durdurmak için bir a kullanmak zorundasınız :-)

Mac işlemcimin% 100,1'ini kullanıyor.

CPU'nun% 100,1'i

System.outAlternatif bir komik davranış denemek için ana işlevin sonunda hareket ettirmeyi deneyebilirsiniz .


lol. Java kendi içinde sıkışmış :)
masterX244

JVM özyinelemeli yükleme kesmek seviyorum.
Isiah Meadows,

20

CSharp

Bir tane daha ve aynı derecede kötü ::

public class P{

    class A<B>{
        public static int C<T>(){
            System.Console.WriteLine(typeof(T));
            return C<A<T>>();
        }
    }
    public static void Main(){
        A<P>.C<int>();
    }
}

Bu özyineleme değildir ... bu, kod şablonlarının yeniden düzenlenmesidir. Görünüşe göre aynı yöntemi çağırıyoruz, çalışma zamanı sürekli olarak yeni yöntemler oluşturuyor. İnt türünü kullanırız, çünkü bu onu tamamen yeni bir tür oluşturmaya zorlar ve yöntemin her bir örneği yeni bir yöntemi denemek zorunda kalır. Burada paylaşım kod yazamaz. Sonunda, söz verdiğimiz ancak asla teslim edilmediğimiz int'nin geri dönüşünü sonsuz beklediği için çağrı yığınını öldürürüz. Benzer şekilde, ilginç tutmak için yarattığımız türü yazmaya devam ediyoruz. Temel olarak çağırdığımız her C, aynı gövdeye sahip olan, son derece yeni bir yöntemdir. Bu, şablonları derleme zamanında yapan C ++ veya D gibi bir dilde mümkün değildir. C # JIT süper tembel olduğundan, sadece bu şeyi mümkün olan en son anda yaratır. Böylece,


14

Redcode 94 (Çekirdek Savaşı)

MOV 0, 1

Bir adrese sıfır adresindeki komutu kopyalar. Çekirdek Savaşı'nda tüm adresler mevcut PC adreslerine göre olduğundan ve çekirdeğin boyutundan modulo olduğu için, bu, atlamayan bir komutta sonsuz bir döngüdür.

Bu program (savaşçı) " Imp " olarak adlandırılır ve ilk AK Dewdney tarafından yayınlandı.


3
Imp'ler yürür, kapılarınızı hazırlar, hazırlar yoksa ezilirsiniz.
seequ

Hazır senin SPL 0, 0; MOV 1, -2gerçekten.
wberry

Güzel, bunun henüz gönderilmediğini umuyordum. +1
mbomb007

14

Dart oyunu

Sanırım bu, gerçek bir özyinelemeli işlev olmadan özyinelemenin klasik yolu olurdu. Aşağıdaki hiçbir işlev doğrudan veya dolaylı olarak isminden söz etmez.

( Dartpad.dartlang.org adresinde deneyin )

// Strict fixpoint operator.
fix(f) => ((x)=>f(x(x))) ((x)=>(v)=>f(x(x))(v));
// Repeat action while it returns true.
void repeat(action) { fix((rep1) => (b) { if (b()) rep1(b); })(action); }

main() {
  int x = 0;
  repeat(() {  
    print(++x);
    return x < 10;
  });
}

6
Y birleştiricisi mi?
aditsu

5
Teknik olarak sanırım Z birleştiricisi çünkü katı bir dil için. Y birleştiricisi sonsuz açılmasını önlemek için tembel bir dil gerektirir. Tek fark, ikinci kısmının eta genişlemiş olmasıdır.
LRN

12

JS

Çok orijinal değil, küçük. 20 karakter.

setInterval(alert,1)

Aslında kaldırabilirsiniz ,1ve hala işe
yarayacak

@Derek 朕 會 功夫 eğer bunu yaparsam, Firefox'ta yalnızca bir uyarı alırım
xem

1
Kromda son parametre olmadan çalışır. Kod, en az bir ortamda çalışıyorsa geçerli sayılmalıdır.
Derek,

3
@Derek 朕 會 功夫setIntervalolsa bir ifade değildir; bu sadece bir fonksiyon. İfade ifadesinin içinde kullanılır ve ifade ifadelerini kullanamazsak, o zaman artık bilmiyorum bile.
Keen

1
@Cory - Peki o zaman geçerli sanırım!
Derek,

12

C sinyalleri

#include <stdio.h>
#include <signal.h>

int main(void) {
    signal(SIGSEGV, main);
    *(int*)printf("Hello, world!\n") = 0;
    return 0;
}

Bu programın davranışı açık bir şekilde çok tanımsız, ancak bugün bilgisayarımda "Merhaba dünya!" Yazıyor.


11

Emacs Lisp

Lisp'in "kodun veri ve verilerin kod olduğu" güçlü tasarımını göstermenin tam zamanı. Verilmiş, bu örnekler çok verimsiz ve bu asla gerçek bağlamda kullanılmamalıdır.

Makrolar, söz konusu döngünün kontrolsüz bir sürümü olan ve üretilen kodun çalışma zamanında değerlendirildiği kod üretir.

tekrarla: N kere tekrarlamanıza izin verir

(defmacro repeat-it (n &rest body)
  "Evaluate BODY N number of times.
Returns the result of the last evaluation of the last expression in BODY."
  (declare (indent defun))
  (cons 'progn (make-list n (cons 'progn body))))

tekrarla testi:

;; repeat-it test
(progn
  (setq foobar 1)

  (repeat-it 10
    (setq foobar (1+ foobar)))

  ;; assert that we incremented foobar n times
  (assert (= foobar 11)))

repeat-it-ile-index:

Bu makro gibidir repeat-itancak gerçekte, genel döngü döngüsü makrosu gibi çalışır do-times, döngü indeksine bağlanacak bir sembol belirlemenizi sağlar. Döngü gövdesi sırasındaki değerini değiştirip değiştirmemenizden bağımsız olarak, indeks değişkeninin her döngünün başında doğru ayarlandığından emin olmak için bir genişleme süresi sembolü kullanır.

(defmacro repeat-it-with-index (var-and-n &rest body)
  "Evaluate BODY N number of times with VAR bound to successive integers from 0 inclusive to n exclusive..
VAR-AND-N should be in the form (VAR N).
Returns the result of the last evaluation of the last expression in BODY."
  (declare (indent defun))
  (let ((fallback-sym (make-symbol "fallback")))
    `(let ((,(first var-and-n) 0)
           (,fallback-sym 0))
       ,(cons 'progn
              (make-list (second var-and-n)
                         `(progn
                            (setq ,(first var-and-n) ,fallback-sym)
                            ,@body
                            (incf ,fallback-sym)))))))

Endeksle tekrarla testi:

Bu test şunları göstermektedir:

  1. Vücut N kere değerlendirir

  2. Dizin değişkeni her yinelemenin başında her zaman doğru bir şekilde ayarlanır

  3. "geri dönüş" adlı bir sembolün değerini değiştirmek endekse karışmaz

;; repeat-it-with-index test
(progn
  ;; first expected index is 0
  (setq expected-index 0)

  ;; start repeating
  (repeat-it-with-index (index 50)
    ;; change the value of a  'fallback' symbol
    (setq fallback (random 10000))
    ;; assert that index is set correctly, and that the changes to
    ;; fallback has no affect on its value
    (assert (= index expected-index))
    ;; change the value of index
    (setq index (+ 100 (random 1000)))
    ;; assert that it has changed
    (assert (not (= index expected-index)))
    ;; increment the expected value
    (incf expected-index))

  ;; assert that the final expected value is n
  (assert (= expected-index 50)))

11

Türlenmemiş lambda taşı

λf.(λx.f (x x)) (λx.f (x x))

3
Bunun özyineleme olarak sayılıp sayılmadığından emin değilim, bunun için temel teorik temeli olan şey ... yine de +1.
kabarık

@fluffy Kendini özyinelemeli değil, fonksiyonların hiçbiri kendilerini çağırmaz (özellikle fonksiyonlar adlandırılmadığı için).
Gurur haskeller 11:14

IMHO, lambda hesabı bir hesaplama modelidir ve bir programlama dili değildir (yani beton makine modeli olmadan lambda hesaplamasını bir PL olarak düşünemeyiz).
Ta Thanh Dinh

Lamda matematiğini yorumlayan bir makine kesinlikle yapabilirsiniz. Ve sözdizimi bir programlama dili olarak kullanılabilir. Bakınız örneğin github.com/MaiaVictor/caramel
Arthur B

10

Haskell, 24 karakter

sequence_ (repeat (print "abc"))

veya yoğunlaştırılmış biçimde, 24 karakter

sequence_$repeat$print"" 

(metin değiştirilse de, bu yine de döngüye girecektir - bu iki tırnak işareti ve sonsuz bir şekilde yeni bir satır yazacaktır)

açıklama: "abc" yazdır, temel olarak sadece "abc" yazdıran bir giriş / çıkış işlemidir.
yineleme, x değerini alan ve yalnızca x değerinden oluşan sonsuz bir liste döndüren bir işlevdir.
dizisi_, bir g / Ç eylemlerinin listesini alan ve tüm eylemleri sırayla yapan bir g / ç işlemi döndüren bir işlevdir.

Bu nedenle, temel olarak, bu program "abc" komutlarının yazdırılmayan sonsuz bir listesini yapar ve bunları tekrar tekrar yürütür. döngü veya özyineleme olmadan.


4
Temelde aynı cevabı Clojure'da repeatgönderecektim , ama olacağını düşündüm a programming language statement which allows code to be repeatedly executed.
seequ

3
fix(print"">>)Bu aynı zamanda açıkça adlandırılmış tekrarlama fonksiyonlarını da içermez.
mniip

1
@TheRare Nasıl kapatıldığını bilmiyorum, ama Haskell tekrarında "kodun tekrar tekrar çalıştırılmasına izin veren bir programlama dili ifadesi" değil - sonsuz listeler üreten bir fonksiyondur. tıpkı "int [] arr = {x, x, x};" gibi bir döngü bir döngüdür.
Gurur haskeller

1
evet, fakat bir şey özyineleme kullanılarak uygulanmalıdır, çünkü onsuz temelde imkansız
gururlu haskeller

3
Aslında, bu kodda bulunan her işlev özyinelemeyi kullanarak bile tanımlanır - hatta baskı
gururlu haskeller

10

ASM (Linux için x86 + I / O)

Bu cılız yüksek seviyeli dillerin ne kadar mücadele edeceği önemli değil, yine de sadece gizli talimat gösterici manipülasyonu olacak. Sonunda, çalışma zamanında döngüyü açmak için yeterince sıkılmadığınız sürece, bir çeşit "goto" (jmp) olacaktır.

Ideone'da kodu test edebilirsiniz

Bu fikrin daha ayrıntılı versiyonunu Matteo Italia DOS kodunda da inceleyebilirsiniz .

0..9 string ile başlar ve onu A..J ile değiştirir, doğrudan atlamalar kullanılmaz (yani "goto" olmadığını söyleriz).

Kod, adres hesaplamanın kötüye kullanılmasıyla daha küçük olabilir, ancak çevrimiçi derleyici üzerinde çalışmak zahmetlidir, bu yüzden olduğu gibi bırakacağım.

Çekirdek kısmı:

mov dl, 'A' ; I refuse to explain this line!
mov ebx, msg ; output array (string)

call rawr   ; lets put address of "rawr" line on stack
rawr: pop eax ; and to variable with it! In same time we are breaking "ret"

add eax, 4 ; pop eax takes 4 bytes of memory, so for sake of stack lets skip it
mov [ebx], dl ; write letter
inc dl ; and proceed to next 
inc ebx
cmp dl, 'J' ; if we are done, simulate return/break by leaving this dangerous area
jg print

push eax ; and now lets abuse "ret" by making "call" by hand
ret

Bütün kod

section     .text
global      _start                              

_start:

;<core>
mov dl, 'A'
mov ebx, msg

call rawr
rawr: pop eax

add eax, 4
mov [ebx], dl
inc dl
inc ebx
cmp dl, 'J'
jg print

push eax
ret
;</core>

; just some Console.Write()
print:
    mov     edx,len
    mov     ecx,msg
    mov     ebx,1
    mov     eax,4
    int     0x80

    mov     eax,1
    xor     ebx, ebx
    int     0x80

section     .data

msg     db  '0123456789',0xa
len     equ $ - msg

Bunu codegolf.stackexchange.com/a/34298/11259 adresinin bir kopyası olarak söyleyecektim , ancak bunun daha önceki bir cevap olduğunu görüyorum. +1
Dijital Travma

@DigitalTrauma oh, birilerinin fikrimin eski versiyonunu yaptığını görüyorum - eski numara, ancak yönetilen kod çağında insanlar işlerin gerçekte nasıl yürüdüğünü unutmaya meyillidirler. (Golf
oynamayı sevmem

9

C önişlemci

Şaşırtma mücadelesinde karşılaştığım küçük bir "teknik". İşlev tekrarı yok, fakat dosya tekrarı var mı?

noloop.c:

#if __INCLUDE_LEVEL__ == 0
int main() 
{
    puts("There is no loop...");
#endif
#if __INCLUDE_LEVEL__ <= 16
    puts(".. but Im in ur loop!");
    #include "noloop.c"
#else
    return 0;
}
#endif

Bunu gcc kullanarak yazdım / test ettim. Açıkçası, derleyicinizin derlemesi için __INCLUDE_LEVEL__makroyu (veya alternatif __COUNTER__olarak bazı ince ayarlı makroyu) desteklemesi gerekir. Bunun nasıl çalıştığı oldukça açık olmalıdır, ancak eğlence için, işlemciyi kodu derlemeden çalıştırın ( -Ebayrağı gcc ile kullanın ).


8

PHP

İşte PHP ile bir tane. Sayaç $ max değerine ulaşana kadar aynı dosyayı dahil ederek döngüler:

<?php
if (!isset($i))
    $i = 0;        // Initialize $i with 0
$max = 10;         // Target value

// Loop body here
echo "Iteration $i <br>\n";

$i++;               // Increase $i by one on every iteration

if ($i == $max)
    die('done');    // When $i reaches $max, end the script
include(__FILE__);  // Proceed with the loop
?>

Bir for döngüsü için aynı:

<?php
for ($i = 0; $i < 10; $i++) {
    echo "Iteration $i <br>\n";
}
die('done');
?>

Kahretsin, bu da özyineleme olarak sayılıyor, değil mi?
Pichan

Öyle olduğunu düşünmeyin - benzerlik @ Nathaniel'in örneğinin aklına geliyor: önişlemci, aynı anda değerlendirilen bu dosyaları içerecek.
36'da

@ Pichan, bellekteki kod kopyaları ile sona erdiğinde, döngü açılımının daha fazla olduğunu söyleyebilirim.
PTwr

Soruyu bugün gördüm ve hemen hemen aynı kodla karşılaştım. Benim için çok geç!
TecBrat

Is header("Location: .?x=".$_GET['x']+1);özyineleme olarak sayılır?
Charlie

8

piton

Aşağıdaki kod özyinelemeli bir işlev içermez (doğrudan veya dolaylı), döngüsel ilkel içermez ve herhangi bir yerleşik işlevi çağırmaz (hariç print):

def z(f):
    g = lambda x: lambda w: f(lambda v: (x(x))(v), w)
    return g(g)

if __name__ == "__main__":
    def msg(rec, n):
        if (n > 0):
            print "Hello world!"
            rec(n - 1)
    z(msg)(7)

"Merhaba dünya!" verilen sayıda.

Açıklama: İşlev zuygulayan katı Z sabit noktalı bir bağdaştırıcının herhangi bir yinelemeli bir algoritma ifade sağlar (yinelemeli tanımlanmamış ise).


gÇok dolaylı olarak özyinelemeli diyebilirim .
seequ

@TheRare Neden? Argüman nedir? Tekrar garayan ne g? Tabii ki, bu numara kendi kendine uygulanan g(g), ancak ilgili bir özyineleme yok. gGörmediyseniz, dolaylı olarak özyinelemeli olarak çağırır g(g)mısınız? Bu, lambda matematiği gibi özyinelemeli tanımlara izin vermeyen dillerde yapmanın standart yoludur.
Petr Pudlák

gArgüman olarak verin xve sonra arayın x(x).
seequ

2
@TheRare Bir işlev (veya bir dizi işlev), nasıl kullanıldığına bağlı olarak özyinelemeli veya özyinelemeli değildir, bu yalnızca tanımı ile belirlenir.
Petr Pudlák

1
tüm cevaplar bir şekilde veya başka bir şekilde aldatıyor: cevapta değilse, cevap kodunu çağırırsa her zaman bir yerde özyinme veya döngü var . Bunun hile yapmasını seviyorum.
Wayne Conrad,

8

z80 makine kodu

Her adreste çalıştırabileceğiniz ve her yerde ROM eşleyebileceğiniz bir ortamda, sıfır ile dolu olan 64kb ROM'u tüm adres alanına eşleyin.

Ne yapar: hiçbir şey. Defalarca.

Nasıl çalışır: İşlemci çalışmaya başlayacaktır, bayt 00bir noptalimattır, bu yüzden siz devam edecek, adrese ulaşacak, $ffffetrafa $0000sarılacak ve nopsiz yeniden başlatana kadar s çalışmaya devam edecektir .

Biraz daha ilginç yapmak için, belleği başka bir değerle doldurun (kontrol akışı talimatlarını önlemek için dikkatli olun).


Belleği sıfırlarla doldurabilir ve oraya bir yere gerçek bir program yerleştirebilirsiniz.
seequ

Böylece 64k program koyabilirsiniz, hiç dallanma olmadan, ve sadece tekrar tekrar yürütülür mü?
Bill Woodger

@BillWoodger, özellikle platformda hiçbir kesinti yoksa (veya hiçbiri etkin değilse)
harold

Kind of fun :-)
Bill Woodger

8

Perl-regex

(q x x x 10) =~ /(?{ print "hello\n" })(?!)/;

gösteri

veya şu şekilde deneyin:

perl -e '(q x x x 10) =~ /(?{ print "hello\n" })(?!)/;'

(?!)Asla denk. Bu nedenle regex motoru , eşleşen dizedeki her sıfır genişlik konumuyla eşleşmeye çalışır .

(q x x x 10)Aynıdır (" " x 10)tekrarlamak - spaceon kere.

Düzenleme: daha iyi anlaşılması için "karakterleri" sıfır genişlik pozisyonlarına dönüştürdü. Bu stackoverflow sorusunun cevaplarına bakınız .


6

T-SQL -12

print 1
GO 9

Aslında Sql Server Management Studio'nun bir tutam daha fazla. GO, bir komut dosyası ayırıcısıdır ve T-SQL dilinin bir parçası değildir. GO ve ardından bir sayı belirtirseniz, bloğu o kadar çok yürütür.


1
Neredeyse her gün T-SQL kullanıyorum ve bunu GO ile yapabileceğinizi bilmiyordum. +1
CailinP

Teknik olarak, bu T-SQL değil. GOaslında bir SSMS yönergesidir, bu yüzden saklı yordamlar gibi T-SQL betikli nesnelere koyamazsınız.
RBarryYoung

Evet, bunu spoiler yorumuma ekledim. Ben sqlcmd kullanarak çok hile olacağını düşünürdüm.
Michael B,

6

C #

Uint.MaxValue ile 0 arasındaki tüm tamsayıları yazdırır.

   class Program
   {
      public static void Main()
      {
          uint max = uint.MaxValue;
          SuperWriteLine(ref max);
          Console.WriteLine(0);
      }

      static void SuperWriteLine(ref uint num)
      {
          if ((num & (1 << 31)) > 0) { WriteLine32(ref num); }
          if ((num & (1 << 30)) > 0) { WriteLine31(ref num); }
          if ((num & (1 << 29)) > 0) { WriteLine30(ref num); }
          if ((num & (1 << 28)) > 0) { WriteLine29(ref num); }
          if ((num & (1 << 27)) > 0) { WriteLine28(ref num); }
          if ((num & (1 << 26)) > 0) { WriteLine27(ref num); }
          if ((num & (1 << 25)) > 0) { WriteLine26(ref num); }
          if ((num & (1 << 24)) > 0) { WriteLine25(ref num); }
          if ((num & (1 << 23)) > 0) { WriteLine24(ref num); }
          if ((num & (1 << 22)) > 0) { WriteLine23(ref num); }
          if ((num & (1 << 21)) > 0) { WriteLine22(ref num); }
          if ((num & (1 << 20)) > 0) { WriteLine21(ref num); }
          if ((num & (1 << 19)) > 0) { WriteLine20(ref num); }
          if ((num & (1 << 18)) > 0) { WriteLine19(ref num); }
          if ((num & (1 << 17)) > 0) { WriteLine18(ref num); }
          if ((num & (1 << 16)) > 0) { WriteLine17(ref num); }
          if ((num & (1 << 15)) > 0) { WriteLine16(ref num); }
          if ((num & (1 << 14)) > 0) { WriteLine15(ref num); }
          if ((num & (1 << 13)) > 0) { WriteLine14(ref num); }
          if ((num & (1 << 12)) > 0) { WriteLine13(ref num); }
          if ((num & (1 << 11)) > 0) { WriteLine12(ref num); }
          if ((num & (1 << 10)) > 0) { WriteLine11(ref num); }
          if ((num & (1 << 9)) > 0) { WriteLine10(ref num); }
          if ((num & (1 << 8)) > 0) { WriteLine09(ref num); }
          if ((num & (1 << 7)) > 0) { WriteLine08(ref num); }
          if ((num & (1 << 6)) > 0) { WriteLine07(ref num); }
          if ((num & (1 << 5)) > 0) { WriteLine06(ref num); }
          if ((num & (1 << 4)) > 0) { WriteLine05(ref num); }
          if ((num & (1 << 3)) > 0) { WriteLine04(ref num); }
          if ((num & (1 << 2)) > 0) { WriteLine03(ref num); }
          if ((num & (1 <<  1)) > 0) { WriteLine02(ref num); }
          if ((num & (1 <<  0)) > 0) { WriteLine01(ref num); }
      }

      private static void WriteLine32(ref uint num) { WriteLine31(ref num); WriteLine31(ref num); }
      private static void WriteLine31(ref uint num) { WriteLine30(ref num); WriteLine30(ref num); }
      private static void WriteLine30(ref uint num) { WriteLine29(ref num); WriteLine29(ref num); }
      private static void WriteLine29(ref uint num) { WriteLine28(ref num); WriteLine28(ref num); }
      private static void WriteLine28(ref uint num) { WriteLine27(ref num); WriteLine27(ref num); }
      private static void WriteLine27(ref uint num) { WriteLine26(ref num); WriteLine26(ref num); }
      private static void WriteLine26(ref uint num) { WriteLine25(ref num); WriteLine25(ref num); }
      private static void WriteLine25(ref uint num) { WriteLine24(ref num); WriteLine24(ref num); }
      private static void WriteLine24(ref uint num) { WriteLine23(ref num); WriteLine23(ref num); }
      private static void WriteLine23(ref uint num) { WriteLine22(ref num); WriteLine22(ref num); }
      private static void WriteLine22(ref uint num) { WriteLine21(ref num); WriteLine21(ref num); }
      private static void WriteLine21(ref uint num) { WriteLine20(ref num); WriteLine20(ref num); }
      private static void WriteLine20(ref uint num) { WriteLine19(ref num); WriteLine19(ref num); }
      private static void WriteLine19(ref uint num) { WriteLine18(ref num); WriteLine18(ref num); }
      private static void WriteLine18(ref uint num) { WriteLine17(ref num); WriteLine17(ref num); }
      private static void WriteLine17(ref uint num) { WriteLine16(ref num); WriteLine16(ref num); }
      private static void WriteLine16(ref uint num) { WriteLine15(ref num); WriteLine15(ref num); }
      private static void WriteLine15(ref uint num) { WriteLine14(ref num); WriteLine14(ref num); }
      private static void WriteLine14(ref uint num) { WriteLine13(ref num); WriteLine13(ref num); }
      private static void WriteLine13(ref uint num) { WriteLine12(ref num); WriteLine12(ref num); }
      private static void WriteLine12(ref uint num) { WriteLine11(ref num); WriteLine11(ref num); }
      private static void WriteLine11(ref uint num) { WriteLine10(ref num); WriteLine10(ref num); }
      private static void WriteLine10(ref uint num) { WriteLine09(ref num); WriteLine09(ref num); }
      private static void WriteLine09(ref uint num) { WriteLine08(ref num); WriteLine08(ref num); }
      private static void WriteLine08(ref uint num) { WriteLine07(ref num); WriteLine07(ref num); }
      private static void WriteLine07(ref uint num) { WriteLine06(ref num); WriteLine06(ref num); }
      private static void WriteLine06(ref uint num) { WriteLine05(ref num); WriteLine05(ref num); }
      private static void WriteLine05(ref uint num) { WriteLine04(ref num); WriteLine04(ref num); }
      private static void WriteLine04(ref uint num) { WriteLine03(ref num); WriteLine03(ref num); }
      private static void WriteLine03(ref uint num) { WriteLine02(ref num); WriteLine02(ref num); }
      private static void WriteLine02(ref uint num) { WriteLine01(ref num); WriteLine01(ref num); }
      private static void WriteLine01(ref uint num) { Console.WriteLine(num--); }
   }

1
Bu önemli olup olmadığını gerçekten bilmiyorum. Açıkça WriteLine01 Int.MaxValue kez çağırıyorsunuz. Az önce büyük miktarda arama deposunun arkasına patladı.
Michael B,

Nasıl sayılmaz? Döngü ve özyineleme yok.
LVBen

1
Ayrıca, bir yığın çağrının 32 yüksek olduğunu düşünmüyorsanız, çağrı yığını büyük bir yere yakın değildir.
LVBen

1
Neden 4294967296 kez yerine sadece 32 kez?
LVBen

4
@ ja72 Hiç döngü veya özyineleme kullanamayacağım açık kaynaklı bir proje üzerinde çalışıyorsam, o zaman tamamen böyle bir koda katkıda bulunacağım!
LVBen

6

JS (tarayıcıda)

Buna ne dersin?

document.write(new Date());
location = location;

Geçerli saati yazdırır ve sayfayı yeniden yükler.


Oh ateş et. Sadece aynı temel kavram ile bir cevap gönderdi. Sayfayı "JavaScript" veya HTML etiketlerini gösteren herhangi bir şey için tarıyordum. Sanırım, cevabımı açık bırakabilirim, çünkü bu konumun "#" içerdiği köşe durumunu ele alıyor. Neyse, +1.
Keen

Firefox 30’da:[Exception... "The operation is insecure." code: "18" nsresult: "0x80530012 (SecurityError)" location: "<unknown>"]
Alex Reynolds,

@AlexReynolds Huh, garip. Mine FF 30'da gayet iyi çalışıyor.
Pichan

Sadece yazılı olduğu gibi kodunuza kopyalayıp yapıştırdım. Çalışmıyor. Belki de bu işi yapması için bazı özel güvenlik tercihleriniz var?
Alex Reynolds,

@AlexReynolds Hayır, hiçbir güvenlik ayarını değiştirmedi. Ve Chrome'da da çalışır.
Pichan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.