Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
ACTIV FM

Inlocuire calculator bord

Abonamente pentru persoane cu diz...

Schimbare parbriz la reprezentanta
 Interogare baza de date

Probleme Hyundai/bobina inductie ?

Problema centrala IsoTwin Condens...

telecomanda universala/Naim uniti...
 Upgrade 3060 Ti vs 4070 ?

Rename SQL column

Achiziționare tuner TV !

Din ce este facuta terasa asta?
 Cum accesez site-ul CNAS ?

Algoritm simplu de calculare al u...

Bitdefender Total Security ș...

casa verde 2024
 

problema recursivitate

- - - - -
  • Please log in to reply
8 replies to this topic

#1
roby26

roby26

    Junior Member

  • Grup: Members
  • Posts: 133
  • Înscris: 29.12.2013
Buna ziua!
As dori sa imi explice cineva urmatorul exercitiu,ce se afiseaza,stiu ca este banal..dar sunt la inceput,si nu inteleg chiar bine recursivitatea.
void f(long n){
   if (n!=0){
     if (n%2!=0)
        cout<<n%10;
   f(n/10);
   if (n%2==0)
       cout<<n%10;
}
   else cout<<endl;
}
Multumesc anticipat!

#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,198
  • Înscris: 24.02.2007
Ce se afiseazi afli compiland & ruland codul.

De ce se afiseaza ce se afiseaza, afli usor, in mod vizual, urmarind pas-cu-pas executia programului in debugger.

#3
roby26

roby26

    Junior Member

  • Grup: Members
  • Posts: 133
  • Înscris: 29.12.2013
Alte idei?

#4
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,384
  • Înscris: 10.08.2005
Să înțeleg că ai urmat sfatul și nu ai obținut nici un rezultat.  Spune în două coloane ce ai înțeles, și ce nu ai înțeles.

#5
Daniel2222

Daniel2222

    Junior Member

  • Grup: Members
  • Posts: 196
  • Înscris: 21.07.2015
#include "stdafx.h"
#include <iostream>
using namespace std;

void f(long n) {
// functia f cu parametrul n
if (n != 0) {
// daca nu este egal cu 0
//////CAZ CONCRET n=91
if (n % 2 != 0)
// daca restul imaprtirii lui n la 2 nu este egal cu 0
//////CAZ CONCRET : restul impartirii lui 91 la 2 este 1.
cout << n % 10;
// se afiseaza restul impartirii lun n la 10
//////CAZ CONCRET -aici afiseaza restul impartirii 91 la 10, acesta fiind 1. 9x10=90 rest 1
f(n / 10);
//apoi se executa aceeasi funtie dar n se imparte la 10
//////CAZ CONCRET - deci se executa tot functia f dar cu parametrul 9, pentru ca 91 impartit la 10 este 9,1 dar numarul n fiind de tip long, adica fara virgula, ramane doar partea intreaga adica 9 si se executa f(9);
//////CAZ CONCRET - continuam de la primul if, n fiind acum 9. Daca n nu este egal cu 0 se execut urmatorul if. Nu este, este 9.
/////// (al doilea if) daca restul impartirii lui n la 2 nu este 0 se tipareste restul impartirii lui n la 10. 9/10=0,9 adica 0 rest 9,
/////// asa ca se afiseaza langa 1 afisat mai inainte 9 si o sa ai pe ecran 19.
if (n % 2 == 0)
cout << n % 10 <<endl;
}
else cout << endl;
}

int main()
{
f(91);

system("Pause");
return 0;
}


Nu stiu eu sa explic foarte bine dar ruleaza in bucla pana nu mai sunt indeplinite conditiile. Citeste comentariile de pe cod, in special unde scrie CAZ CONCRET, pentru ca este  un exemplu si se intelege mai bine.

Edited by Daniel2222, 11 April 2017 - 23:23.


#6
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,384
  • Înscris: 10.08.2005

Quote

// daca restul imaprtirii lui n la 2 nu este egal cu 0
te doare inima sa spui "daca n este impar" ?

#7
Daniel2222

Daniel2222

    Junior Member

  • Grup: Members
  • Posts: 196
  • Înscris: 21.07.2015
nu ai tu idee ce ma doare!
daca ai ceva de reprosat poti sa formulezi si mai frumos
nu te gandi ca i-am raspuns initiatorului pentru a-ti face tie in ciuda!
pentru ce era nevoie sa-mi analizezi mie durerile...?

Edited by Daniel2222, 12 April 2017 - 21:06.


#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,384
  • Înscris: 10.08.2005
Da, pentru ca n-am inteles exact cand

Quote

// daca restul imaprtirii lui n la 2 nu este egal cu 0
/////// (al doilea if) daca restul impartirii lui n la 2 nu este 0 se tipareste restul impartirii lui n la 10
nu vad sa fie nici o diferenta logica intre ele, doar una semantica

Dar trecem si peste asta, te intreb pe tine, cand anume se excuta al doilea if ?

void f(long n)
{
	if (n != 0) // numar nenul
	{
		if (n % 2 != 0) // numar impar
		{
			cout << n % 10; // se afiseaza ultima cifra
		}
		f(n / 10); // functia se apeleaza pe sine cu 1/10 din numar
		if (n % 2 == 0) // numar par
		{
			cout << n % 10;
		}
	}
	else { // numar nul
		cout << endl; // functia se termina
	}
}

Edited by MarianG, 12 April 2017 - 23:16.


#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,198
  • Înscris: 24.02.2007

 dani.user, on 11 aprilie 2017 - 16:53, said:

De ce se afiseaza ce se afiseaza, afli usor, in mod vizual, urmarind pas-cu-pas executia programului in debugger.

https://forum.softpe...recursivitatea/

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate