Sunteți pe pagina 1din 3

Probleme propuse

1. Permutari fara puncte fixe


Pentru numarul natural n dat se cere sa se genereze toate permutarile
multimii {1,2,…,n} care au proprietate dea a nu contine puncte fixe. O permutare
are puncte fixe daca exista macar o componenta care coincide cu pozitia sa. De
exemplu, permutarea p=(2 13) are un singur punct fix (p[3]=3).

2. Plata unei sume cu monede de valori date


Se cunosc o suma S de bani precum si n tipuri de monede avand valorile
v1,v2,v3,...,vn. Presupunand ca din fiecare moneda exista cantitati oricat de mari,
se cer toate modalitaile posibile de plata a sumei S utilizand monede date.

3. Traseu minim pentru vioajorul commercial


Un voiajor commercial trebuie sa vizitese un numar de n orase codificate
1,2,…,n. Initial acesta se afla in orasul I. Comis-voiajor doreste sa nu treaca de
doua ori in acelasi oras si in final sa revina in orasul I. Cunoscand toate legaturile
direce existente intre orase, precum si lungimea acestor legaturi, se cere sa se
determine un traseu de lungime medie pentru comis-voiajor.

4. Permutari speciale 1
Pentru numarul natural n dat, se cere sa se genereze toate permutarile
multimii {1,2,..,n} care au proprietatea ca fiecare componenta infara de prima are in
fata ei macar o componenta de care sa difere printr-o unitate.

Produs scalar a doi vectori

Se dau doi vectori a si b cu cate un n componente fiecare. Sa se calculeze cu


ajutorul unei functii recursive produsul lor scalar.

Solutie
Fie a=( a1,a2,...,an) si b=(b1,b2,...,bn) cei doi vectori. Produsul lor scalar este
P=a1*b1+a2*b2+...+anbn.
Utilizam pentru calcul urmatoarea functie:

Prod(n) = prod( n-1)+ a[n]*b[n], daca n>1.


a[1]*b[1], daca n=1.
#include<iostream.h>
long prod(int k, int a[], int b[])
{
if (k>1)
Return prod (k-1,a,b) + a[k]*b[k];
else
return a[i]*b[i];
}
int main()
{
int a[11], b[11];
int n,i;
cout<<”n=”; cin>>n;
cout<<”dato vectorul a:”;
for(i=1; i<=n; i++) cin>>a[i];
cout<<”dati vectorul b:”;
for(i=1; i<=n; i++) cin>>b[i];
cout<<”produsul scalar =”<<prod (n,a,b)<<endl;
return 0;
}

Inversare numar natural

Se da un numar natural nenul ce poate fi memorat intr-o variabila de tip long. Se


cere sa se afiseze numarul format cu cifrele inversate.

Solutie

Problema este similara cu cea anterioara. De aceasta data vom folosi o functie
care nu are variabile locale, dar are un perimetru formal. Rezolvarea se bazeaza pe
selectia si afisarea cifrei unitatilor numarului ce trebuie inversat, urmata de inversarea
numarului obtinut prin eliminarea aceste cifre.
#include<iostream.h>
void invers (long k)
{
if(k!=0)
{
cout<<k%10;
invers(k/10);
}
}
int main()
{
long n;
cout<<"n="; cin>>n;
cout<<"numarul inversat:";
invers(n);
return 0;
}

Recursivitate inversa
Probleme propuse

1. Se da un numar naturan n. Calculati, folosind o functie recursiva, suma cifrelor


lui n.
2. Fie n un numar natural. Determinati, folosind o functie recursiva, cifra maxima
a lui n.
3. Fie n un numar natural. Determinati, folosind o functie recursiva, numarul de
cifre ale lui n.
4. Se da un numar naturan n. Calculati, folosind o functie recursiva, suma
numerelor care sunt prefixe ale lui n.