Strona 1 z 1

[C++] rekurencja (rekursja).

: 17 lis 2020, o 00:17
autor: xdominika
Jak napisać programy:
1) void rozklad(int n)
który drukuje rozkład liczby na czynniki pierwsze rekurencyjnie. Wiem jak zrobić to iteracyjnie, ale za pomocą rekursji nie mam pojęcia.
2) void ciag(int p, int r, int n)
który drukuje n-elementowy ciąg arytmetyczny o początkowym wyrazie p i różnicy r
Ten również potrafię napisać iteracyjnie, rekurencyjnie jedynie udaje mi się tak, że wyświetla się n-ty wyraz a nie wszystkie (używam funkcji int, przy void mam błąd, że nie mogę użyć operatora +).

Kod: Zaznacz cały

int ciag(int p, int r, int n)
{
    if (n==1)
        return p;
    else
       return ciag(p, r, n-1)+r;
}

Re: C++ rekurencja (rekursja).

: 17 lis 2020, o 08:41
autor: Dasio11
1.

Kod: Zaznacz cały

void rozklad( int n )
{
    if( n == 1 )
    {
        std::cout << 1;
        return;
    }

    unsigned int d = 2;
    while( n % d != 0 ) ++d;

    std::cout << d;
    if( d < n )
    {
        std::cout << "*";
        rozklad( n/d );
    }
}

Re: C++ rekurencja (rekursja).

: 17 lis 2020, o 12:38
autor: rivit
2.

Kod: Zaznacz cały

void ciag(int p, int r, int n){
    if(!n) return;

    std::cout << p << ", ";
    ciag(p+r, r, n-1);
}
Przykładowe wywołanie:

Kod: Zaznacz cały

ciag(-1, 2, 5);
Rezultat:

Kod: Zaznacz cały

-1, 1, 3, 5, 7,

Re: C++ rekurencja (rekursja).

: 18 lis 2020, o 14:41
autor: xdominika
rivit pisze: 17 lis 2020, o 12:38 2.

Kod: Zaznacz cały

void ciag(int p, int r, int n){
    if(!n) return;

    std::cout << p << ", ";
    ciag(p+r, r, n-1);
}
Przykładowe wywołanie:

Kod: Zaznacz cały

ciag(-1, 2, 5);
Rezultat:

Kod: Zaznacz cały

-1, 1, 3, 5, 7,
Niestety wyświetla mi się tylko pierwszy wyraz ciągu

Re: C++ rekurencja (rekursja).

: 18 lis 2020, o 15:13
autor: rivit
W takim razie pokaż, jak użyłaś mojego kodu.

Re: C++ rekurencja (rekursja).

: 20 lis 2020, o 10:25
autor: xdominika
rivit pisze: 18 lis 2020, o 15:13 W takim razie pokaż, jak użyłaś mojego kodu.

Kod: Zaznacz cały

 void ciag(int p, int r, int n){
    if(!n) return;

    cout << p << ", ";
    ciag(p+r, r, n-1);
} 
Oczywiście wcześniej użyłam

Kod: Zaznacz cały

 using namespace std; 

Re: C++ rekurencja (rekursja).

: 20 lis 2020, o 12:20
autor: rivit
Trochę się nie zrozumieliśmy - chodziło mi o to, jak wygląda cały twój kod, bo błąd leży ewidentnie w wywołaniu funkcji ciag


Całość programu u mnie wygląda tak:

Kod: Zaznacz cały

#include <iostream>

void ciag(int p, int r, int n){
    if(!n) return;

    std::cout << p << ", ";
    ciag(p+r, r, n-1);
}

int main() {
    ciag(-1, 2, 5);
}

Re: C++ rekurencja (rekursja).

: 25 lis 2020, o 00:14
autor: xdominika
rivit pisze: 20 lis 2020, o 12:20 Trochę się nie zrozumieliśmy - chodziło mi o to, jak wygląda cały twój kod, bo błąd leży ewidentnie w wywołaniu funkcji ciag


Całość programu u mnie wygląda tak:

Kod: Zaznacz cały

#include <iostream>

void ciag(int p, int r, int n){
    if(!n) return;

    std::cout << p << ", ";
    ciag(p+r, r, n-1);
}

int main() {
    ciag(-1, 2, 5);
}
Ja w sposób rekurencyjny potrafię jedynie stworzyć funkcję typu int, która zwraca n-ty wyraz ciągu, a żeby rekurencyjnie wyświetlały mi się wszystkie wyrazy tego ciągu, niestety nie udało mi się wymyślić.

Kod: Zaznacz cały

void ciag1(int p, int r, int n){
    if(n==1) cout<<p;
    else cout<<ciag(p, r, n-1)+r;
}
Niestety nie działa on jak powinien.

Re: [C++] rekurencja (rekursja).

: 25 lis 2020, o 09:32
autor: Dasio11
Ale na czym w tej chwili polega Twój problem? Chcesz poznać rozwiązanie problemu, czy chcesz wytłumaczenia dlaczego Twoje rozwiązanie jest złe, czy jeszcze coś innego? Bo jeśli to pierwsze, to rivit już dwa razy podał Ci pełny kod.