2010-12-22 12 views
33

Bir şeyi ne kadar ardarda çağırabilirsin diye bir kontrol var mı? Ben STACKSIZE bağlıdır biraz üzerinde 18kC# Recursion Depth - Ne kadar derin gidebilir

bir yineleme derinliğini olsun temel bir test programı itibaren

....

belki (bir iş parçacığı bellek yığını kurmak için bir yol yoktur) yineleme derinliğini artırmak için büyük bir yığın ile?

+0

olası bir kopyası [Yönetilen yürütülebilir.net için varsayılan yığın boyutunu nasıl değiştirirsiniz] (http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed -executable-net) –

+1

Sonsuz derin. Ya da en azından kuyruk çağrılarını destekleyen dillerde. – Juliet

+6

3 seviyeleri derin ...

cevap

40

Bazı belge tanıma sırasında yığın boyutunu artırdım. Gerçekten gerekliydi.

Yani şu kodu kullanarak iş parçacığı yığın boyutunu artırabilir:

var stackSize = 10000000; 
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize); 

Serisini (ThreadStart, Int32) - maksimum yığın boyutu belirterek, Konu sınıfının yeni bir örneğini başlatır iş parçacığı için.

Source

Umut ihtiyacınız olanı bu.

+9

Gerçekten kimsenin ihtiyacı olduğu konusunda şüphem var. Sadece böyle bir kod oluşturmamalısın, deneyen bir programcıyı çuvalladım. Herhangi bir özyinelemeli algoritma özyinelemeden uygulanabilmekte ve bazen problemin sırasını bir büyüklükte azaltacak şekilde uygulanabilmektedir. Bu, bir motoru tamir etmek için kızak çekiç kullanan bir araba tamircisi gibidir. – Mick

+0

@Mick, eğer özyineleme kullanan kod sizin kontrolünüzün dışındaysa? Örneğin, özyineleme kullanan bir üçüncü taraf kitaplığı kullanıyor olabilirsiniz. – Sam

+8

Dördüncü tarafa rastladım;) – Mick

5

Varsayılan yığın boyutu, PE başlığında saklanır.

İş parçacığını kendiniz üretiyorsanız, iş parçacığı yığın boyutunu bir parametre olarak alan bir yapıcıya sahiptir.

Ancak, 1 MB'lık varsayılan .NET yığını boyutu çoğu görev için yeterli olmalıdır, bu nedenle değiştirmeden önce en azından görevi gözden geçirmelisiniz.

16

Burada sorunlara yakalandığınızı düşünüyorum. Yinelemeli bir algoritmanın ne kadar yığın kullanacağını tam olarak belirlemek zor. Ve eğer yeterli olacaksa, bir sorun varsa, başka bir yaklaşım ararım. Çoğu yinelemeli algoritmalar yinelemeli olmamak için yeniden yazılabilir. Ardından, ihtiyacınız olduğu kadar fazla bellek ayırabilir ve yeterli olmadığında bile incelikle düzeltebilirsiniz.

+16

+1 Her özyinelemeli algoritma, döngü ve yığın veri yapısı ile özyinelemeli olarak yazılabilir. –

+6

@Byron: Üniversitedeki veri yapılarımı hatırlamamı sağladığın için teşekkürler. Prof: "Bu ağaç geçiş programını yinelemeli olmayan bir biçimde yazın." Ben: "Neden bizden nefret ediyorsun?" :) –

+4

Sorum, nasıl yapılacağıydı, aslında bunu yapmak istemekten daha meraklıydım. Bu iyi bir tavsiye olsa da, sorulan soruya cevap vermiyor. –

2

Daha fazla yineleme derinliği elde etmeyi başarsanız bile, sadece performans nedenleriyle bu algoritmayı yineleme olmadan uygularım. Metot çağrıları, bir süre döngü içinde yinelemeden çok daha pahalıdır. Varsayılan yığın boyutuyla uğraşmayı gerektiren her şeyin uygulanmasını şiddetle tavsiye ederim.

Bazen özyinelemeyi kullanırım ancak çağrı derinliği tanımlandığında ve düşük olduğunda (100'den küçükse). Ticari yazılım oluştururken, belirsiz sayıda yineleme içeren özyinelemeli algoritmalar kullanmak tamamen profesyonelce değildir ve size çok kızgın müşteriler vermesi muhtemeldir.