6

🧩 Syntax:
using System;
using System.Collections.Generic;
using System.Diagnostics;

class Zadanie6
{
    static void Main()
    {
        int numerAlbumu = 35736; 
        int n = Math.Min(40, (int)Math.Round(numerAlbumu / 100.0)); // Ograniczenie do 40 dla rekurencji
        
        Console.WriteLine("=== Obliczanie ciągu Fibonacciego ===");
        Console.WriteLine($"Dla n = {n} (wyliczone z numeru albumu {numerAlbumu})");
        Console.WriteLine();

        // Test rekurencyjny
        TestujAlgorytm("Rekurencyjny", () => {
            long kroki = 0;
            long wynik = FibonacciRekurencyjnie(n, ref kroki);
            return (wynik, kroki);
        });
        
        // Test memoizacji
        TestujAlgorytm("Memoizacja", () => {
            long kroki = 0;
            long wynik = FibonacciMemo(n, ref kroki);
            return (wynik, kroki);
        });
        
        // Test iteracyjny
        TestujAlgorytm("Iteracyjny", () => {
            long kroki = 0;
            long wynik = FibonacciIteracyjnie(n, ref kroki);
            return (wynik, kroki);
        });
    }

    static void TestujAlgorytm(string nazwa, Func<(long wynik, long kroki)> algorytm)
    {
        try
        {
            Console.WriteLine($"[{nazwa}] Rozpoczęcie obliczeń...");
            var stoper = Stopwatch.StartNew();
            var (wynik, kroki) = algorytm();
            stoper.Stop();
            
            Console.WriteLine($"Wynik: {wynik}");
            Console.WriteLine($"Liczba kroków: {kroki}");
            Console.WriteLine($"Czas: {stoper.Elapsed.TotalMilliseconds} ms");
            Console.WriteLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Błąd: {ex.Message}");
        }
    }

    // Wersja rekurencyjna z licznikiem kroków
    static long FibonacciRekurencyjnie(int n, ref long licznikKrokow)
    {
        licznikKrokow++; // Zliczamy każde wywołanie funkcji
        if (n < 0) throw new ArgumentException("n nie może być ujemne");
        if (n <= 1) return n;
        return FibonacciRekurencyjnie(n - 1, ref licznikKrokow) 
             + FibonacciRekurencyjnie(n - 2, ref licznikKrokow);
    }

    // Wersja z memoizacją z licznikiem kroków
    static long FibonacciMemo(int n, ref long licznikKrokow)
    {
        if (n < 0) throw new ArgumentException("n nie może być ujemne");
        return FibonacciMemoHelper(n, new Dictionary<int, long>(), ref licznikKrokow);
    }

    static long FibonacciMemoHelper(int n, Dictionary<int, long> pamiec, ref long licznikKrokow)
    {
        licznikKrokow++; // Zliczamy każde wywołanie funkcji
        if (n <= 1) return n;
        if (pamiec.TryGetValue(n, out long wartosc)) return wartosc;
        
        long wynik = FibonacciMemoHelper(n - 1, pamiec, ref licznikKrokow) 
                   + FibonacciMemoHelper(n - 2, pamiec, ref licznikKrokow);
        pamiec[n] = wynik;
        return wynik;
    }

    // Wersja iteracyjna z licznikiem kroków
    static long FibonacciIteracyjnie(int n, ref long licznikKrokow)
    {
        licznikKrokow++; // Krok: sprawdzenie warunku wejściowego
        if (n < 0) throw new ArgumentException("n nie może być ujemne");
        
        licznikKrokow++; // Krok: sprawdzenie warunku n <= 1
        if (n <= 1) return n;

        long poprzedni = 0;
        long obecny = 1;
        licznikKrokow += 2; // Kroki: przypisania początkowych wartości

        for (int i = 2; i <= n; i++)
        {
            licznikKrokow++; // Zliczamy każdą iterację pętli
            
            long nowy = poprzedni + obecny;
            poprzedni = obecny;
            obecny = nowy;
            
            licznikKrokow += 3; // Kroki: obliczenia i przypisania
        }
        
        licznikKrokow++; // Krok: zwracanie wyniku
        return obecny;
    }
}
Guest

Guest