He estado haciendo varias funciones que computarán la sigma en una gama de funciones muy específicas. Ahora estoy tratando de escribir una función sigma que ingrese una lambda o una función y luego calcule la suma de sus salidas dentro de un rango. Tengo el código de iteración bien pero ahora necesito descubrir cómo ingresar un lambda y llamarlo dentro de esa función. Aquí está mi código actual:

int sigma(int start, int end, ? function) {
    if (start == end) {
        return function(start);
    }
    else {
        return function(start) + sigma(start + 1, end, function);
    }
}

PD: si alguien pudiera ayudarme a hacer que esto no use recursión, eso sería increíble

1
user19273 26 abr. 2020 a las 05:20

2 respuestas

La mejor respuesta

Puede convertir esta función en una plantilla de función:

template<typename Fn>
int sigma(int start, int end, Fn function) {
 // ...
}

Y luego llámalo con una lambda:

auto lam = [](int) { return 42; };

std::cout << sigma(1, 5, lam);

Para evitar la recursión, el cuerpo simplemente podría ser:

int sum = 0;
for (int i = start; i <= end; ++i)
  sum += function(i);

return sum;
1
cigien 26 abr. 2020 a las 02:23

Necesita el tipo para su parámetro. Entonces, pregúntese qué se supone que es este parámetro. Según su definición de sigma(), parece esperar un objeto similar a una función que se invoca con un parámetro int y devuelve un int. Es decir, un std::function<int(int)>. La declaración de su función podría terminar pareciéndose a la siguiente.

int sigma(int start, int end, std::function<int(int)> & function);

Si desea manejar funciones con otras firmas, entonces una plantilla de función podría ser más apropiada. Vea std :: function vs template para una discusión.

0
JaMiT 26 abr. 2020 a las 03:39