def recurse_while(predicate, f, *args):
    """
    Accumulate value by executing recursively function `f`.

    The function `f` is executed with starting arguments. While the
    predicate for the result is true, the result is fed into function `f`.

    If predicate is never true then starting arguments are returned.

    :param predicate: Predicate function guarding execution.
    :param f: Function to execute.
    :param *args: Starting arguments.
    """
    result = f(*args)
    result = result if type(result) == tuple else (result, )
    while predicate(*result):
        args = result # predicate(args) is always true
        result = f(*args)
        result = result if type(result) == tuple else (result, )

    return args if len(args) > 1 else args[0]