Wpis z mikrobloga

#naukaprogramowania #csharp

Programy w których stosuje się rekurencje dłużej się kompilują? Załóżmy, że mamy dwie wersje programu na znalezienie silni, jedna która jest "zwykła", a druga w której stosujemy rekurencje. Ta druga dłużej będzie się kompilować?
  • 34
  • Odpowiedz
@Need: Myślę że różnica w czasie kompilacji jest zaniedbywalna. CLR robi optymalizację rekurencji ogonowej co pewnie chwilę trwa ale tym zajmuję się JIT więc jest to w zasadzie już w trakcie działania.
  • Odpowiedz
@Blackhorn: @3THU5_9r3W: Ogólnie dzisiaj napisałem mały programik który symuluje rzuty monetą (wyświetla wszystkie wyniki i sumuje reszki i orły) i jak się nim bawiłem to wpisałem, żeby zrobił coś koło 10 milionów rzutów czekałem chyba z 3-5 minut na wynik, da się to jakoś przyspieszyć czy raczej na początkowym etapie się czymś takim nie przejmować?
  • Odpowiedz
@3THU5_9r3W: No, ale to dopiero pod koniec jak już skończy rzucać albo jak nie uda się userowi liczby wprowadzić, a nie w celu powtarzania rzutu.
  • Odpowiedz
@Need: No właśnie jak się nie userowi nie uda liczby wprowadzić to ponawiasz operację (pytasz o liczbę powtórzeń) używając rekurencji. Jak nie przewidujesz cywilizowanego zakończenia programu to możesz zrobić while(true). Jak chcesz skonczyć jak wpisze np. 'q' to w while sprawdzaj czy ostatni znak to nie 'q'.
  • Odpowiedz
@Need: co do zabaw z przyspieszaniem:
1. new List(1000) sprawi że list będzie miała gotowe miejsce na 1000 elementów dzięki czemu wywołania Add() będą szybsze. (nie będzie musiał alokować miejsca na każdy nowy element. Zamiast 1000 możesz przekazać liczbę elementów.
2. rnd.Next(0, 2) jest ciut wolniejsze od rnd.NextDouble() > 0.5
3. Wydaje mi się że 99% czasu który czekałeś zajmowało wypisywanie na ekran spróbuj to wykomentować i zobacz ile wtedy zajmie.
  • Odpowiedz
3. Wydaje mi się że 99% czasu który czekałeś zajmowało wypisywanie na ekran spróbuj to wykomentować i zobacz ile wtedy zajmie.

EDIT: No chyba nawet 99.9999999% ( ͡° ͜ʖ ͡°). Konsola jest wolna.


@3THU5_9r3W: Racja, teraz zajęło to sekundę nawet bez zmian z wcześniejszych punktów, co do tej rekurencji to nie rozumiem dalej dlaczego taka rekurencja jak tutaj miałaby mieć jakiś wpływ na wydajność skoro celem jest
  • Odpowiedz
@Need: Nie o wydajność tu chodzi a o czytelność i zakomunikowanie czytającemu kod co chcesz osiągnąć. Rekurencji używa się raczej w algorytmach operujących na drzewiastych strukturach danych albo do policzenia silni/ciągu fibonaciego ( ͡° ͜ʖ ͡°).
Swoją drogą w tym Twoim przypadku gdyby użytkownik podał nieliczbę około 40000 razy to program wywalił by się ze StackOverflowException. Każde wywołanie funkcji odkłada się na stosie.
  • Odpowiedz
@Need:

using System;

namespace ConsoleApp7
{
class Program
{
private static int _calls;

private static void Dupa()
{
Console.WriteLine(_calls);
_calls++;
Dupa();
}

static void Main(string[] args)
{
Dupa();
}
}
}

128989 razy dokładnie u mnie.
  • Odpowiedz