Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c] Ciekawe, ciąg, jak zrobić w jednej funkcji rekurencję

Ostatnio zmodyfikowano 2015-03-25 21:09
Autor Wiadomość
Pietia
Temat założony przez niniejszego użytkownika
[c] Ciekawe, ciąg, jak zrobić w jednej funkcji rekurencję
» 2015-03-24 15:36:07
Zadanie jest takie, trzeba napisać funkcję rekurencyjną, która dla otrzymanej w argumencie nieujemnej liczby całkowitej n zwraca wartość elementu o indeksie n ciągu zdefiniowanego w następujący sposób
a0=a1=1
an=an-1+n dla n parzystych
an=an-1*n dla n nieparzystych
(n, n-1 to indeksy dolne w tym zapisie)
Wiem jak to zrobić rozkładając na 2 funkcje(kod poniżej), nie mam pojęcia jak zrobić taką rekurencję w 1 funkcji, ponieważ kiedy daję n-1 w parzystej liczbie to zamienia się w nieparzystą i wszystko się sypie...

C/C++
//na 2 funkcje
# include <stdio.h>

int ciag( int n );
int ciag2( int n );

int main()
{
    int n;
    printf( "Podaj n\n" );
    scanf( "%d", & n );
    if( n % 2 == 0 )
         printf( "Oto jest ciag2(n): %d\n", ciag( n ) );
    else
         printf( "Oto jest ciag(n): %d\n", ciag( n ) );
   
    return 0;
}

int ciag( int n ) //dla nieparzystych
{
    if( n == 0 )
         return 0;
   
    switch( n )
    {
    case 1:
        return 0;
    case 2:
        return 2;
    default:
        {
            return( ciag( n - 1 ) * n );
        }
    }
}

int ciag2( int n ) //dla parystych
{
    if( n == 0 )
         return 0;
   
    switch( n )
    {
    case 1:
        return 0;
    case 2:
        return 2;
    default:
        {
            return( ciag2( n - 1 ) + n );
        }
    }
}

próbowałem zrobić tak ale wyniki są złe

C/C++
# include <stdio.h>

int ciag( int n );

int main()
{
    int n;
    printf( "Podaj n\n" );
    scanf( "%d", & n );
    printf( "Oto jest ciag(n): %d\n", ciag( n ) );
   
    return 0;
}

int ciag( int n )
{
    if( n == 0 )
         return 0;
    //dla parzystych
    if( n % 2 == 0 )
    {
        switch( n )
        {
        case 1:
            return 1;
        case 2:
            return 2;
        default:
            return( ciag( n - 1 ) + n );
        }
    }
    //dla nieparzystych
    else
    {
        switch( n )
        {
        case 1:
            return 0;
        case 2:
            return 2;
        default:
            {
                return( ciag( n - 1 ) * n );
            }
        }
    }
}
P-129041
pekfos
» 2015-03-24 19:11:58
C/C++
if( n % 2 == 0 )
     printf( "Oto jest ciag2(n): %d\n", ciag( n ) );
else
     printf( "Oto jest ciag(n): %d\n", ciag( n ) );

No i niby masz w jednej funkcji.
P-129072
Pietia
Temat założony przez niniejszego użytkownika
» 2015-03-25 12:37:08
Niby:-) n-1 sprawia, że liczba jest na zmianę traktowana jak parzysta i nieparzysta, a nie o to chodzi.
P-129138
darko202
» 2015-03-25 13:25:57
C/C++
/*
mamy 
a(0)=a(1)=1
a(n)=a(n-1)+ n  dla n parzystych
a(n)=a(n-1)* n  dla n nieparzystych
*/

int ciag( int n )
{
    if( n == 0 ) // a(0) = 1
         return 1;
   
    if( n == 1 ) // a(1) = 1
         return 1;
   
    if( n % 2 == 1 ) //a(n)=a(n-1)* n  dla n nieparzystych
         return( ciag( n - 1 ) * n );
   
    else // a(n)=a(n-1)+ n  dla n parzystych
         return( ciag( n - 1 ) + n );
   
P-129139
Pietia
Temat założony przez niniejszego użytkownika
» 2015-03-25 14:34:47
Rozumiem, ale dlaczego wobec tego te dwa programy, dają inne wyniki?
P-129142
Monika90
» 2015-03-25 19:50:14
Bo pierwszy z nich jest błędny.
P-129159
Pietia
Temat założony przez niniejszego użytkownika
» 2015-03-25 21:09:02
Heh, myślałem, że drugi. W każdym razie dzięki:-)
P-129173
« 1 »
  Strona 1 z 1