rekurencja - wynik zawsze jest równy 1

0

za każdym razem gdy wykonuje się rekurencja liczy x jako 0 i wynik jest 1

namespace _10_rekurencja
{
    class Program
    {
        static uint IleJedynek(uint n)
        {
            uint x = 0;
            if (n < 1)
            {
                 
                return 0;

            }
            IleJedynek(n/2);
            
            if (n%2 ==1)
            {
                 x++;
            }
            return x;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(IleJedynek(221));
            Console.ReadKey();
        }
    }
}
0

Jaki problem ma ten program rozwiązywać?

EDYCJA: Ok, jeśli to ma liczyć ilość jedynek w liczbie, jak sugeruje nazwa funkcji, to pseudokod:

function ones_digits(n):
	if n == 0: return 0
	else if: n % 10 == 1: return 1 + ones_digits(n / 10) # dzielenie w integerach
	else: return ones_digits(n / 10)
0

Załóżmy, że n >= 1. Jako, że funkcja zwraca zmienną x, prześledźmy jaką wartość ma x po kolejnych linijkach przeformatowanego kodu funkcji (w komentarzu znajdzie się wartość po danej linijce):

uint x = 0;    // x == 0
if (n < 1) { return 0; } // nie zmieniamy x. Jako, że n >= 1, nic nie zwracamy. Zatem x == 0
IleJedynek(n/2); // tu wywołujemy jakąś funkcję, która niemniej jednak nie zmienia wartości x, zatem po tej linijce wciąż x == 0
if (n%2 ==1) { x++; } // tutaj, w zależności od parzystości n, powiększymy x o jeden, lub nie
return x; // zwracamy 0 lub 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1