Jeśli będziesz sumował od elementu ostatniego do "zerowego", pozbędziesz się jednego if'a.
Tu masz etapy dochodzenia do kodu docelowego. Etap 4 i 5 bym sobie już odpuścił... no ale ... można :)
#include <iostream>
#include <cstddef>
// Poszczególne etapy...
int even_sum1(int * tab, std::size_t size, int sum = 0) {
--size;
if(size == 0) {
if((*tab % 2) == 0) {
sum += *tab;
}
return sum;
}
if((tab[size] % 2) == 0) {
sum += tab[size];
}
return even_sum1(tab, size, sum);
}
int even_sum2(int * tab, std::size_t size, int sum = 0) {
--size;
sum += ((tab[size] % 2) ? 0: tab[size]);
if(!size) {
return sum;
}
return even_sum2(tab, size, sum);
}
int even_sum3(int * tab, std::size_t size, int sum = 0) {
--size;
sum += ((tab[size] % 2) ? 0: tab[size]);
return (!size ? sum: even_sum3(tab, size, sum));
}
int even_sum4(int * tab, std::size_t size, int sum = 0) {
sum += ((tab[--size] % 2) ? 0: tab[size]);
return (!size ? sum: even_sum3(tab, size, sum));
}
int even_sum5(int * tab, std::size_t size, int sum = 0) {
return (sum += (tab[--size] % 2) ? 0: tab[size],
(!size ? sum: even_sum5(tab, size, sum)));
}
int main() {
int tab[] = { 2, 1, 4, 8 }; // even_sum(...) == 14
const std::size_t table_size = sizeof(tab) / sizeof(*tab);
std::cout << even_sum1(tab, table_size) << '\n';
std::cout << even_sum2(tab, table_size) << '\n';
std::cout << even_sum3(tab, table_size) << '\n';
std::cout << even_sum4(tab, table_size) << '\n';
std::cout << even_sum5(tab, table_size) << '\n';
}
Argument sumy przekaż jako domyślny 0 (zero), wtedy w wywołaniu nie będzie konieczności jego podawania.
Często w takim kodzie stosuje się także operator 3-argumentowy (czyli: .... ? ... : .... )