rekurencja - wynik zawsze jest równy 1

Odpowiedz Nowy wątek
2020-02-12 20:40

Rejestracja: 3 miesiące temu

Ostatnio: 21 godzin temu

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();
        }
    }
}
edytowany 1x, ostatnio: Ktos, 2020-02-12 23:04
Żeby zrozumieć rekurencję, trzeba zrozumieć rekurencję. - PerlMonk 2020-02-12 20:52

Pozostało 580 znaków

2020-02-12 20:49

Rejestracja: 3 lata temu

Ostatnio: 4 minuty temu

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)

edytowany 1x, ostatnio: lion137, 2020-02-12 21:08
Ziom, mógłbyś kiedyś odnieść się do problemu z kodem, zamiast podawania rozwiązania w innym języku? - enedil 2020-02-13 00:10

Pozostało 580 znaków

2020-02-13 00:14

Rejestracja: 6 lat temu

Ostatnio: 10 godzin temu

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
edytowany 1x, ostatnio: enedil, 2020-02-13 00:15

Pozostało 580 znaków

Odpowiedz

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