Se consideră subprogramul f cu definiţia alăturată. Ce valoare are f(1213111,1)?
int f (long n, int k){
if (n!=0)
if(n%10==k) return 1+f(n/10,k);
else return 0;
}
Va rog mult,este o problema pentru teza mea la informatica daca ma puteti ajuta si as fi recunoscatoare daca rezolvarea ar fi pentru clasa a 10a
Răspunsuri la întrebare
Răspuns de
10
O sa trec prin toti pasii programului pentru a intelege despre ce este vorba
mai intai: prin restul impartirii lui n la 10 obtii ultima cifra a lui n.
De exemplu daca n=324 sa zicem, n%10=4
prin impartirea lui n la 10 folosind / obtii catul impartirii lui n la 10 si totodata numarul format din toate cifrele cu exceptia ultimei cifre
n/10=324/10=32
Acestea stiute avem asa:
acele siruri de instructiuni din interiorul functiei, daca ar fi sa le faci cu acolade pentru a distince ce face fiecare in parte, ar arata asa
if(n!=0){ if(n%10==k) return 1+f(n/10,k); else return 0; }
daca n este diferit de 0 atunci
daca ultima cifra a numarului este egala cu cifra k, atunci returnam rezultatul
1+f(n/10,k) unde f(n/10+k) este functia reapelata dar de data aceasta pentru un numar format din toate cifrele de dinainte cu exceptia ultimei cifre
Daca in schimb ultima cifra nu este egala cu k, atunci returneaza 0 si functia se opreste din apelari.
Hai sa facem exemplul: f(1213111,1) si sa notam valoarea cu S S=f(1213111,1)
avem n=1213111 ultima cifra este 1. Este 1=k? adica 1=1? Da este, atunci returneaza S=1+f(121311,1)
ca sa il aflam pe S, trebuie atunci sa il calculam pe f(121311,1)
ne uitam cat face aceasta functie: ultima cifra este 1, 1=1? Da, atunci devine
f(121311,1)=1+f(12131,1) Inlocuim in suma de sus
S=1+1+f(12131,1) Dar acum trebuie sa calculam valoarea lui f din nou
12131 are ultima cifra 1. Este 1=1? Da, atunci
f(12131,1)=1+f(1213,1)
Inlocuim in suma de mai sus
S=1+1+1+f(1213,1)
Deci trebuie sa calculam si f(1213,1)
ultima cifra a lui 1213 este 3. Atunci, 3=1? Nu, nu este. Atunci vedem ca va returna 0. Deci
f(1213,1)=0 si suma devina S=1+1+1=3
iti dai seama ca programul va returna numarul de cifre de la coada lui n care sunt egale cu cifra k.
Ai mai jos implementat programul cu un cout care iti reflecta diversele etape de parcurgere pentru n
#include <iostream>
using namespace std;
int f(long n,int k){
if(n!=0){
cout<<"Valoare:"<<n<<endl;
if(n%10==k) return 1+f(n/10,k);
else return 0;
}
}
int main(){
int n=1213111,k=1;
cout<<f(n,k);
return 0;
}
mai intai: prin restul impartirii lui n la 10 obtii ultima cifra a lui n.
De exemplu daca n=324 sa zicem, n%10=4
prin impartirea lui n la 10 folosind / obtii catul impartirii lui n la 10 si totodata numarul format din toate cifrele cu exceptia ultimei cifre
n/10=324/10=32
Acestea stiute avem asa:
acele siruri de instructiuni din interiorul functiei, daca ar fi sa le faci cu acolade pentru a distince ce face fiecare in parte, ar arata asa
if(n!=0){ if(n%10==k) return 1+f(n/10,k); else return 0; }
daca n este diferit de 0 atunci
daca ultima cifra a numarului este egala cu cifra k, atunci returnam rezultatul
1+f(n/10,k) unde f(n/10+k) este functia reapelata dar de data aceasta pentru un numar format din toate cifrele de dinainte cu exceptia ultimei cifre
Daca in schimb ultima cifra nu este egala cu k, atunci returneaza 0 si functia se opreste din apelari.
Hai sa facem exemplul: f(1213111,1) si sa notam valoarea cu S S=f(1213111,1)
avem n=1213111 ultima cifra este 1. Este 1=k? adica 1=1? Da este, atunci returneaza S=1+f(121311,1)
ca sa il aflam pe S, trebuie atunci sa il calculam pe f(121311,1)
ne uitam cat face aceasta functie: ultima cifra este 1, 1=1? Da, atunci devine
f(121311,1)=1+f(12131,1) Inlocuim in suma de sus
S=1+1+f(12131,1) Dar acum trebuie sa calculam valoarea lui f din nou
12131 are ultima cifra 1. Este 1=1? Da, atunci
f(12131,1)=1+f(1213,1)
Inlocuim in suma de mai sus
S=1+1+1+f(1213,1)
Deci trebuie sa calculam si f(1213,1)
ultima cifra a lui 1213 este 3. Atunci, 3=1? Nu, nu este. Atunci vedem ca va returna 0. Deci
f(1213,1)=0 si suma devina S=1+1+1=3
iti dai seama ca programul va returna numarul de cifre de la coada lui n care sunt egale cu cifra k.
Ai mai jos implementat programul cu un cout care iti reflecta diversele etape de parcurgere pentru n
#include <iostream>
using namespace std;
int f(long n,int k){
if(n!=0){
cout<<"Valoare:"<<n<<endl;
if(n%10==k) return 1+f(n/10,k);
else return 0;
}
}
int main(){
int n=1213111,k=1;
cout<<f(n,k);
return 0;
}
alexutaq:
Multumesc mult de tot pentru explicatii,am inteles tot!!
Alte întrebări interesante
Ed. muzicală,
8 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă