private double _value(final Interval<Double> region,
            final Function<Double, Double> function, final double firstGuess,
            final int iteration, final DoubleAbsolute criterion) {
        if (this.getMaximumIterations() < iteration)
            throw new MaximumIterationsException(iteration);
        HashMap<Interval<Double>, Double> values =
                new HashMap<Interval<Double>, Double>();
        Evaluator<Function<Double, Double>, Interval<Double>, Double> evaluator =
                this.getEvaluator();
        for (Interval<Double> interval : this._SplitInterval(region, iteration))
            values.put(interval, evaluator.value(function, interval));
        double v = 0.0;
        for (Interval<Double> value : values.keySet())
            v += values.get(value);
        if (!criterion.value(firstGuess, v))
        {
            for (Interval<Double> value : values.keySet())
                values.put(value, this._value(value, function, values.get(value),
                iteration+1, new DoubleAbsolute(criterion.getPrecision()/2.0)));
            v = 0.0;
            for (Interval<Double> value : values.keySet())
                v += values.get(value);
        }
        return v;
    }