Problem sa rekurzivnom metodom

Pitanje ili opis problema

Pozdrav. Imam problem sa kodom ovog zadatka. Ono što me zbunjuje jesu dvije rekurzivne statičke metode koje se koriste ovdje. Zbunjuje me njihova logika. Prvo ću navesti tekst zadatka pa ću vam navesti kod a zatim izdvojiti te dvije rekurzivne metode.
TEKST ZADATKA
Napisati C# program koji od korisnika učitava prirodne brojeve n i M,
potom n brojeva c0, c1, . . . , cn−1 i proverava da li se umetanjem znakova + ili −
između unetih brojeva, bez menjanja redosleda unetih brojeva, može dobiti aritmetički izraz čija vrednost je M. Na primer za n = 7, M = 14 i brojeve 1, 4, 7, 5, 8, 1
izraz 1+4+7−5+8−1 ima vrednost 14.
REŠENJE ZADATKA
Da bismo od brojeva c0, . . . , cn−2, cn−1 napravili broj M pokušavamo
prvo da ispred poslednjeg broja u nizu stavimo znak + i da od brojeva c0, . . . ,
cn−2 rekurzivnim pozivom napravimo broj M −cn−1. Ako to ne uspe, pokušavamo
potom da ispred poslednjeg broja u nizu stavimo znak − i da od brojeva c0, . . . ,
cn−2 rekurzivnim pozivom napravimo broj M + cn−1. Ako ni to ne uspe, problem
nema rešenje.
Evidenciju o operacijama koje smo umetnuli ispred brojeva vodimo u
pomoćnom nizu karaktera op ovako: op[i] == ’+’ znaci da smo ispred i-tog broja
umetnuli znak +; dok op[i] == ’-’ znaci da smo ispred i-tog broja umetnuli
znak −.

KOD ZADATKA

class Program
{
    static bool Pokusaj(int[] a, char[] op, int i, int M)
    {
        if (i == 0)
        {
            return a[0] == M;
        }
        op[i] = '+';
        bool moze = Pokusaj(a, op, i - 1, M - a[i]);
        if (moze)
        {
            return true;
        }
        op[i] = '-';
        moze = Pokusaj(a, op, i - 1, M + a[i]);
        if (moze)
        {
            return true;
        }
        return false;

    }


    static void IspisiResenje(int[] a, char[] op, int n, int M)
    {
        Console.Write(a[0]);
        for (int i = 1; i < n; i++)
        {
            Console.Write(" {0} {1} ", op[i], a[i]);
        }
        Console.WriteLine("={0} ", M);

    }









    static void Main(string[] args)
    {
            int n = int.Parse(Console.ReadLine());
            var a = new int[n];
            Console.WriteLine(" Brojevi-->");
            for (int i = 0; i < n; a[i++] = int.Parse(Console.ReadLine()))
            {

            }
            Console.WriteLine(" Rez-> ");
            int M = int.Parse(Console.ReadLine());
            var op = new char[n];
            bool moze = Pokusaj(a, op, n - 1, M);
            if (moze)
            {
                IspisiResenje(a, op, n, M);
            }
            else
            {
                Console.WriteLine(" Ne moze");
            }

       

    }
}}

Ono što mene zbunjuje u ovom zadatku jesu statične metode Pokusaj i IspisiResenje.
Na osnovu čega ja dobijem rezultat na kraju i kako uopšte ove metode funkcionišu nije mi jasno. Kako uopšte metoda Pokusaj dobija parametar i kada ga ja nidje ne proslijeđujem u Main dijelu program. Također ako možete da mi objasnite logiku ove dviju metode. Ljudi molim vas pomozite :smiley: .