Стани премиум член и добиј попуст на 2000+ производи и куп други бенефити!

Рекурзија во C - помош

Hurikan

read-only
22 август 2012
1
0
Неможам да ги сфатам чекорите за рекурзијата во следните 4 програми(ќе го поставам кодот):

1. Функцијата треба да пресмета збир на сите цифри шо се наогаат на непарни позиции (гледано од десно кон лево)

Код:
#include <stdio.h>
 
int func(int x) {
 
    if (x < 10) return 0;
 
    return ((x/10)%10 + func(x/100));
}
 
int main(){
 
    int n;
 
    printf("Vnesi eden priroden broj: ");
    scanf("%d", &n);
    printf("Zbirot na cifrite koi se naogaat na neparni pozicii iznesuva %d.\n", func(n));
 
    return 0;
}

2. Функцијата треба да го пресмета производот на сите цифри кои се на парни позиции.

Код:
#include <stdio.h>
 
int func(int x)
{
    if (x < 10) return 1;
 
        else return ((x/10)%10) * func(x/100);
}
 
int main()
{
    int n;
 
    printf("Vnesi eden priroden broj: ");
    scanf("%d", &n);
    printf("Proizvodot na cifrite koi se naogaat na parni pozicii iznesuva %d.\n", func(n));
    return 0;
}

3. Функцијата треба да го врати бројот кој се добива само од цифрите кои се наоѓаат на непарни позиции, гледано од десно кон лево и ќе формира нов број. Се смета дека најмалку значајната цифра се наоѓа на 0-та позиција.

Код:
#include <stdio.h>
 
int suma_neparni(int a)
{
    if(a==0)
        return 0;
    return a%10+10*suma_neparni(a/100);
}
 
int main() {
    int broj;
    scanf("%d", &broj);
    printf("%d",suma_neparni(broj/10));
    return 0;
}

4. Функцијата за даден природен број ќе го врати збирот на сите парни цифри кои во исто време се наоѓаат на парни позиции, гледано од десно кон лево. Се смета дека најмалку значајната цифра се наоѓа на 1-та позиција.

Код:
#include <stdio.h>
 
int suma_parni(int a)
{
    if(a==0)
        return 0;
    if((a%10)%2!=0)
        return suma_parni(a/100);
    return a%10+suma_parni(a/100);
}
 
int main() {
    int broj;
    scanf("%d", &broj);
    printf("%d",suma_parni(broj/10));
    return 0;
}

Значи проблемот е во тоа што незнам кој чекор што функција има. Знам да ја искузам програмата и ќе работи, но тоа не е решение за да се научи. Сакам детално образложение за тоа како работи рекурзијата во наведените случаи (доволно е еден да се објасни кој ви е најлесен останатите веројатно ќе ги сфатам сам). Чекор по чекор ќе ве молам. И ве молам не пишувајте коментари во стилот "незнам што не ти е јасно", "како не го знаеш тоа а знаеш да ја искуцаш" итн итн. Нека пишува некој што ќе може да објасни и ќе сака. Фала однапред. Поздрав.
 

Spamalot

lurker
13 јуни 2011
943
308
neznam koj ti gi resaval zadacite ama prvata e pogresna, ja popraviv pa vidi sega dali ke ti bide pojasna, ako ne ti e pisi ke se obidam da ti ja objasnam, iako e tesko vaka so pisuvanje :S
vtorata e tocna, a drugite ne mrzese da gi gledam :D





#include <stdio.h>

int func(int x) {

if (x < 10) return x;

return ((x/%10) + func(x/100));
}

int main(){

int n;

printf("Vnesi eden priroden broj: ");
scanf("%d", &n);
printf("Zbirot na cifrite koi se naogaat na neparni pozicii iznesuva %d.\n", func(n));

return 0;
}
 

EvIL_GuY

read-only
9 октомври 2008
23
1
neznam koj ti gi resaval zadacite ama prvata e pogresna, ja popraviv pa vidi sega dali ke ti bide pojasna, ako ne ti e pisi ke se obidam da ti ja objasnam, iako e tesko vaka so pisuvanje :S
vtorata e tocna, a drugite ne mrzese da gi gledam :D





#include <stdio.h>

int func(int x) {

if (x < 10) return x;

return ((x/%10) + func(x/100));
}

int main(){

int n;

printf("Vnesi eden priroden broj: ");
scanf("%d", &n);
printf("Zbirot na cifrite koi se naogaat na neparni pozicii iznesuva %d.\n", func(n));

return 0;
}

Не е ни твојта точна. Пробај да внесеш на пример 101, програмата враќа резултат 1 а всушност треба 0.

Јас го решив тоа вака:

Код:
#include <stdio.h>
 
int func(int x) {
 
if (x < 10) return x;
 
if (((x / 100)%10 != 0) && ((x / 1000)%10 == 0)) //ova moze i so x > 99 i x < 1000 ama vaka e po gikovsko :D
return (x/10)%10;
 
return ((x/10)%10 + func(x/100));
}
 
int main(){
 
int n;
 
printf("Vnesi eden priroden broj: ");
scanf("%d", &n);
printf("Zbirot na cifrite koi se naogaat na neparni pozicii iznesuva %d.\n", func(n));
 
return 0;
}
 

Spamalot

lurker
13 јуни 2011
943
308
Не е ни твојта точна. Пробај да внесеш на пример 101, програмата враќа резултат 1 а всушност треба 0.

Јас го решив тоа вака:

Код:
#include <stdio.h>
 
int func(int x) {
 
if (x < 10) return x;
 
if (((x / 100)%10 != 0) && ((x / 1000)%10 == 0))
return (x/10)%10;
 
return ((x/10)%10 + func(x/100));
}
 
int main(){
 
int n;
 
printf("Vnesi eden priroden broj: ");
scanf("%d", &n);
printf("Zbirot na cifrite koi se naogaat na neparni pozicii iznesuva %d.\n", func(n));
 
return 0;
}


tocna e i vraka 2 kako i sto treba, a ne 0, 0 e pogresen rezultat vo sluvajov... proveri ke vidis, neznam zasto komliciras vo tvoeto resenie tolku mnogu :S
 

EvIL_GuY

read-only
9 октомври 2008
23
1
tocna e i vraka 2 kako i sto treba, a ne 0, 0 e pogresen rezultat vo sluvajov... proveri ke vidis, neznam zasto komliciras vo tvoeto resenie tolku mnogu :S

Кај мене враќа 1 ќе ти пратам и screenshot ако сакаш, инаку мислам дека и 2 ако ти враќа е погрешно бидејќи се брои од нула па еден, два ... и тн.

Ако на пример внесеш непарен број од 5 цифри: 12345 збирот на цифрите треба да ти биде 6 а кај тебе ќе биде 7 бидејќи ке се собере и првата цифра а таа се наоѓа на 4 - то место. Кај парните броеви излегува точно, затоа е моето "комплицирање" а ако си го видел коментарот може да се постави циклуст вака:

if((x > 99) || (x < 1000))
return (x / 10)%10;
 

Spamalot

lurker
13 јуни 2011
943
308
Кај мене враќа 1 ќе ти пратам и screenshot ако сакаш, инаку мислам дека и 2 ако ти враќа е погрешно бидејќи се брои од нула па еден, два ... и тн.

Ако на пример внесеш непарен број од 5 цифри: 12345 збирот на цифрите треба да ти биде 6 а кај тебе ќе биде 7 бидејќи ке се собере и првата цифра а таа се наоѓа на 4 - то место. Кај парните броеви излегува точно, затоа е моето "комплицирање" а ако си го видел коментарот може да се постави циклуст вака:

if((x > 99) || (x < 1000))
return (x / 10)%10;

ne e ova matrica a ni niza... nema zasto da gi brois cifrite taka.. ednostavno si e, prvata cifra si e prva, nema nulta cifra.
druga pricina zasto vo slucajov nema 0.... kazi mi nulata e parna ili neparna ? :D
 

EvIL_GuY

read-only
9 октомври 2008
23
1
ne e ova matrica a ni niza... nema zasto da gi brois cifrite taka.. ednostavno si e, prvata cifra si e prva, nema nulta cifra.
druga pricina zasto vo slucajov nema 0.... kazi mi nulata e parna ili neparna ? :D

Па можеби не е матрица но гледајќи го првото решение што го има постирано дечкото очигледно е дека првата цифра се наоѓа на нулто место затоа што:

Код:
return ((x/10)%10 + func(x/100));

со овој ред код гледаш дека се вади цифрата која се наоѓа на втората позиција значи ако внесеш 101 се издвојува втората цифра т.е 0 а бидејќи во задачата се бара цифрите на непарно место мора цифрата 1 да е на нулто место а цифрата 0 на прво место односно непарно место.
 

Spamalot

lurker
13 јуни 2011
943
308
Па можеби не е матрица но гледајќи го првото решение што го има постирано дечкото очигледно е дека првата цифра се наоѓа на нулто место затоа што:

Код:
return ((x/10)%10 + func(x/100));

со овој ред код гледаш дека се вади цифрата која се наоѓа на втората позиција значи ако внесеш 101 се издвојува втората цифра т.е 0 а бидејќи во задачата се бара цифрите на непарно место мора цифрата 1 да е на нулто место а цифрата 0 на прво место односно непарно место.

ima razlika izmegu "pozicija" i "index", 0 ne bi mozela vo nikoj slucaj da bide ni parna ni neparna... ako napravime algoritam za da proveruva parnost mislis li deka 0 ke go ispolni uslovot ? :S
 

EvIL_GuY

read-only
9 октомври 2008
23
1
ok, jas sepak mislam deka ima razlika izmegu "pozicija" i "index", i deka 0 ne bi mozela vo nikoj slucaj da bide ni parna ni neparna... ako napravime algoritam za da proveruva parnost mislis li deka 0 ke go ispolni uslovot ? :S

Па да, нулата не е ни парна ни непарна затоа не се замараш со таа цифра што се наоѓа на нулта позиција, во задачата ти се бараат само цифрите од непарните позиции.
 

Risto-

read-only
10 септември 2012
2
0
Probajte so ovoj kod:
Код:
#include <iostream>
 
using namespace std;
 
int zbir_neparni_pozicii(int x)
{
    /* zbir na cifri na broj shto se naogaat na neparna pozicija gledano od desno kon levo */
    if(x == 0) return 0;
    return x % 10 + zbir_neparni_pozicii(x / 100);
}
 
int main(int argc, char * argv[])
{
    int broj;
    cin >> broj;
    cout << zbir_neparni_pozicii(broj) << endl;
    return 0;
}
 

vojo

read-only
17 јануари 2011
11
4
neznam koj ti gi resaval zadacite ama prvata e pogresna, ja popraviv pa vidi sega dali ke ti bide pojasna, ako ne ti e pisi ke se obidam da ti ja objasnam, iako e tesko vaka so pisuvanje :S
vtorata e tocna, a drugite ne mrzese da gi gledam :D





#include <stdio.h>

int func(int x) {

if (x < 10) return x;

return ((x/%10) + func(x/100));
}

int main(){

int n;

printf("Vnesi eden priroden broj: ");
scanf("%d", &n);
printf("Zbirot na cifrite koi se naogaat na neparni pozicii iznesuva %d.\n", func(n));

return 0;
}

Се сложувам потполно со ова решение, бидејќи во задачата не е нагласено на која позиција ти е најмалку значајната цифра .... во последната задача е напоменато дека најмалку значајната цифра т.е единиците се на 1-ва позиција, и затоа имаш делење со 10 во main-от кога се повикува функцијата. Во овој случај јас би земал првата цифра од десно на лево (0-та позиција) да биде првата непарна цифра и кодот си е ок.

EvIL_GaY друже ти ја сваќам логиката, ама овде не станува збор за полиња, јас ги гледам само како цифри (прва цифра-непарна,втора-парна итн). Значи и твојот код е ок ако го гледаш бројот од 1-ва позиција па нагоре.
Можеби во задачата би требало да биде нагласено на која позиција се наоѓа најмалку значајната цифра...и немаше да има олку крвопролевање...... :D....


Risto тоа е тоа само во С++.
 
членови онлајн
мислења
теми
членови

IT.mk/market понуда

Бесплатна достава на 3000 производи
На врв Дно