Programiranje

Zadatak u VBu (rekurzija)

luka.miskovic sub 14.4.2012 12:24

pozdrav ljudi .... moze mala pomoć oko zadatka u VBu.

u pitanju je rekurzivna funkcija, zadatak je:

 

"—Napraviti rekurzivnu funkciju koja računa zbroj svih parnih brojeva do nekog broja."

 

poćetnik sam sto se tice programiranja, pa bih molio ako nije problem netko pomogne.

Floki ned 15.4.2012 15:08

Rekurzija je ponovno pozivanje funkcije iz same funkcije.

Pošto znamo da se pozivom funkcije argumenti i članovi funkcije smještaju na stog, a da se ključnom riječju return funkcija završava, a njezini argumenti skidaju sa stoga,

a pošto izvršimo niz uzastopnih poziva funkcije, kad sa keyword-om return završimo funkciju dolazi do skidanja sa stoga tog niza funkcija, a mi to možemo iskoristiti za matematičke izračune. Funkcije se sa stoga skidaju po načelu LIFO (zadnja pozvana se prva skida).

 

Na ovaj naš zadatak primjena rekurzije bi išla ovako:

 

#include<iostream>
using namespace std;
 
int ZbrojParnih(int broj)
{
    if(broj < 2) return 0; // prekidni uvjet
    return (broj - broj%2) + ZbrojParnih(broj - 2); // ponovni poziv funkcije
}
int main()
{
    cout<< "Unesi broj: ";
    int broj;
    cin>> broj;
    int sumaParnih = ZbrojParnih(broj);
    cout<< sumaParnih << endl;
    return 0;
 
}
 

 

Ako npr. želimo izračunati sumu parnih brojeva do 6, ova rekurzivna funkcija bi ovako radila:

 

 

 

ZbrojParnih(6);

 

1. Prvim pozivom funkcije na stog se smješta broj 6

2. Drugim pozivom funkcije na stog se smješta broj 4

3. Trećim pozivom funkcije na stog se smješta broj 2

4. Kod četvrtog poziva funkcije aktivira se prekidni uvjet jer je broj manji od 2 i na stog se smješta 0

Sada dolazi do skidanja funkcija sa stoga po načelu posljednja pozvana prva skinuta

1. 2 + 0

2. 4 + 2

3. 6 + 6

Primjeti što je bit uvođenja matematičkog izračuna kod skidanja funkcija sa stoga, onoga trenutka kad smo dobili prvu poznatu vrijednost funkcije, a to je 0, mi smo znali sve,

kad skidamo funkciju ispod nje, njezina vrijednost je 2, sljedeća funkcija ima vrijednost 6, a zadnja funkcija koju skidamo sa stoga ima vrijednost 12, dakle skidanjem zadnje funkcije sa stoga, odnsno one koju smo prvu pozvali, dobijamo krajni rezultat.

 

p.s. žao mi je što ti nisam ovo mogao napisati u VB, ali ne znam se s njim služiti, a koliko vidim jedino ovi što rade u C/C++ rješavaju ove "matematičke zadatke".

 

 

luka.miskovic ned 15.4.2012 15:47

super, hvala puno, ovo objašnjenje mi je puno tog razjasnilo jer nisam bas razumio na koji način rekurzija radi... 

mozda nekome pomogne pa cu evo stavit i kod u VBu. 

 

Imports System.Console

 

Module Module1

 

   Function racun(ByVal br As Integer) As Integer

     If br < 2 Then

       Return 0

     End If

     Return (br - (br Mod 2)) + racun(br - 2)

 

   End Function

 

 

   Sub Main()

     Dim br As Integer

     WriteLine("Unesite broj: ")

     br = ReadLine()

     WriteLine(racun(br))

   End Sub

 

End Module

Hvala puno još jednom.