Siedzę nad funkcjami rekurencyjnymi, a konkretnie rekurencjami ogonowymi. Moim zadaniem jest zsumowanie wszystkich liczb znajdujących się w tablicy. O ile iteracyjna wersja funkcji nie sprawiła mi najmniejszy problemów, tak rekurencyjna robi ze mną co tylko zapragnie. Napisałem taki oto programik ćwiczebny:
Kod: Zaznacz cały
/* Cwiczenie rekurencji
* Moim zadaniem jest zsumowanie wszystkich komórek tablicy
*/
#include <stdio.h>
#include <stdlib.h>
int suma(const int *src, size_t length, int sum)
{
if (length)
{
sum = sum + *src;
length = length - 1;
src = src + 1;
/* Testuję wartości podczas kolejnych wywołań */
printf("sum = %d, length = %d\n", sum, length);
suma( src, length, sum );//kolejne poziomy rekurencji
}
/* Ostatnim poleceniem ma być wywołanie rekurencyjne lub powrót z funkcji.
* Tylko wtedy funkcja będzie mogła być ogonowa. */
return *src + sum;
}
int sumujTablice(const int* tab, size_t len)
{
return suma(tab, len, 0);//pierwszy poziom rekurencji
}
int main(void)
{
int tablica[] = { 8, 13, 15, 20 };
printf("Suma liczb w tablicy wynosi %d\n", sumujTablice(tablica, sizeof(tablica) / sizeof(tablica[0]) ) );
int key = getchar();
return EXIT_SUCCESS;
}A to jest wynik działania programu:
Program brnie w kolejne poziomy rekurencji i prawidłowo sumuje wartości kolejnych komórek tablicy. Jednak podczas powrotu dzieje się coś niedobrego (i tu właśnie nie wiem co) i program kończy działanie zwracając jedynie sumę dwóch pierwszych komórek tablicy.
Szczerze mówiąc nie bardzo widzę, gdzie popełniam błąd. Chętnie przyjmę jakąś pomoc w rozwiązaniu tego problemu

