4 programy w c++ ; Problem ze zrozumieniem zadania


(Antonedzio) #1

Nie mogę zrozumieć tych czterech zadań.

Mógł by mi ktoś wytłumaczyć (powiedzieć jak krowie na rowie) o co w nich chodzi?

Tak abym mógł je sam napisać.

Ewentualnie pomógł je napisać.

Kompilator z którego korzystam to DEV C++

Wersja 5.4.0

Programowania uczę się dopiero drugi rok więc mogę nie wszystko zrozumieć.

1

Napisz funkcje rekurencyjna, która dla otrzymanej w argumencie

nieujemnej liczby całkowitej n zwraca wartosc elementu o indeksie n

ciagu zdefiniowanego w nastepujacy sposób

a0 = a1 = 1

an = an-1 + n dla n parzystych

an = an-1 * n dla n nieparzystych.

2

Napisz funkcje rekurencyjna, która dla otrzymanej w argumen-

cie nieujemnej liczby całkowitej n zwraca wartosc elementu o indeksie

n ciagu zdefiniowanego w nastepujacy sposób

a0 = a1 = a2 = 1

oraz dla k > 2

a3·k = a3·k-1 + a3·k-2

a3·k+1 = 5 a3·k + 4

a3·k+2 = a3·k+1.

3

Napisz funkcje rekurencyjna, która dla otrzymanej w argumentach

pary nieujemnych liczb całkowitych n im zwraca wartosc f(n,m) gdzie

funkcja f jest zdefiniowana w nastepujacy sposób:

f(n, 0) = n

f(0,m) = m

f(n,m) = f(n - 1,m) + f(n,m - 1) + f(n - 1,m - 1) dla n,m > 0.

4

Napisz funkcje rekurencyjna, która dla otrzymanej w argumentach pa-

ry nieujemnych liczb całkowitych n i m zwraca wartosc f(n,m) gdzie

funkcja f jest zdefiniowana w nastepujacy sposób:

f(n, 0) = n

f(n,m) = f(m, n)

f(n,m) = n -m + f(n - 1,m) + f(n,m - 1) dla n m > 0.


([alex]) #2

Przecież napisano jak krowie na rowie. Którego słowa nie rozumiesz?


(Antonedzio) #3

Funkcja rekurencyjna to taka z której każdy element wynika z poprzedniego elementu. Tak?

A po drugie: "zwraca wartosc elementu o indeksie n ciagu zdefiniowanego w nastepujacy sposób"

zwraca wartość - rozumiem

elementu o indeksie n - nie rozumiem

ciągu zdefiniowanego w następujący sposób - to się tyczy chyba do tego poprzedniego indeksu (nie rozumiem)

-- Dodane 05.06.2013 (Śr) 17:45 --

Ok. Trochę się pogłowiłem. Ale myślę że to rozgryzłem.

W 1 chodzi to to że gdy wpisze jedynkę lub zero to wypisze 1.

Gdy wpiszę liczbę nieparzystą (nie równą 0 ani 1) to zastosuje wzór an = an-1 * n

A gdy wpiszę liczbę parzystą (nie równą 0 ani 1) to zastosuje wzór an = an-1 + n

Tak?

Ale jeżeli tak to zo to jest ta funkcja rekurencyjna??


(Grzelix) #4

indeks to jest to n

powiedzmy mamy funkcję a0 = 0;an = a_n-1 + 1;

więc:

a0 = 0

a1 = 1

a2 = 2 i tak dalej

czyli wartość dla indeksu 3 będzie 3.

Teraz o co chodzi z tą funkcją rekurencyjną. Funkcja rekurencyjna wywołuje sama siebie najprościej mówiąc. Prosty przykład dla tego ciągu który zdefiniowałem

f(int n){

if(n = 0){ return 0;} //warunek zakończenia


return f(n-1) + 1;

}

jak to wygląda rozwinięcie tego dla np 2 -> f(2) = f(1) + 1 = f(0)+ 1+ 1 = 0+1+1 = 2

więcej przykładów oczywiście znajdziesz w necie np: http://javastart.pl/zaawansowane-progra ... -rekursja/


([alex]) #5

Doprawdy!?


(Rolek0) #6

@op

Polecam:

Miłej zabawy :smiley:


(Antonedzio) #7

Wydawało mi się że zrozumiałem.

Ale nadszedł jeszcze jeden problem.

To program nr 1;

#include 


using namespace std;

int main(int argc, char *argv[]) {


	int f(int n){

	if(n == 0 || n == 1){ return 0;}

	return f(n-1) + n;

	}


	int g(int n){

	if(n == 0 || n == 1){ return 0;}

	return f(n-1) * n;

	}


	int a;



	cout << "Podaj liczbę" << endl;

	cin >> a ;

	if (a mod 2 == 0) {cout << f(a) << endl;}

	if (a mod 2 == 1) {cout << g(a) << endl;}

	}


	return 0;

}

A to błędy które wypisuje :

6 14 D:\Users\ANton\Desktop\zadania z programowania\Rozwiazania\27\main.cpp [Error] a function-definition is not allowed here before '{' token 


29 1 D:\Users\ANton\Desktop\zadania z programowania\Rozwiazania\27\main.cpp [Error] expected '}' at end of input 


  D:\Users\ANton\Desktop\zadania z programowania\Rozwiazania\27\Makefile.win [Error] [main.o] Error 1

Najpierw poszukuje otwarcia nawiasu a potem jego zamknięcia.

Gdzie mam błąd??


(Grzelix) #8

błąd mówi:

a function-definition is not allowed here

masz definicję funkcji wewnątrz funkcji main. czyli powinno być mniej więcej tak:

#include 


using namespace std;

int main(int argc, char *argv[]) {

   int a;


   cout << "Podaj liczbę" << endl;

   cin >> a ;

   if (a mod 2 == 0) {cout << f(a) << endl;}

   if (a mod 2 == 1) {cout << g(a) << endl;}

   }

return 0;

}



   int f(int n){

   if(n == 0 || n == 1){ return 0;}

   return g(n-1) + n;

   }


   int g(int n){

   if(n == 0 || n == 1){ return 0;}

   return f(n-1) * n;

   }

Do tego masz jeszcze błąd w logice programu. Ponieważ ciąg jest zdefiniowany naprzemiennie a ty bierzesz pod uwagę tylko pierwszy argument. Jeśli masz liczbę n parzystę i wywołujesz funkcję dla n-1 to n-1 jest nieparzyste i powinieneś dla tego argumentu odwołać się drugiej zdefiniowanej przez ciebie funkcji.

Mam nadzieję że zrozumiale to napisałem.

Btw. Pisane z palca może zawierać literówki, wersja poprawiona względem powyższej uwagi.


(Antonedzio) #9

Ok. Najważniejsze że już chociaż trochę rozumiem.

Czyli po poprawkach powinien program wyglądać tak?

#include 


	int f(int n){

	if (n == 0 || n == 1){ return 1;} else {

	if (n % 2 == 0) {return f(n-1) + n;} else {

	return f(n-1) * n;

			}

		}

	}


using namespace std;

int main(int argc, char *argv[]) {


	int a;


	cout << "Podaj liczbę" << endl;

	cin >> a ;

	cout << " Wynik to: " << f(a) << endl;


	return 0;

}

-- Dodane 07.06.2013 (Pt) 13:38 --

Chłopaki .....

-- Dodane 10.06.2013 (Pn) 16:44 --

Prosze o odnowienie tematu bo nadal nie rozwiązaliśmy wszystkich kwestii :slight_smile: