Problema com recursividade

Boa Tarde, poderiam me ajudar com essa minha tentativa de recursão? Sou péssima nesse assunto, só sei fazer fatorial usando essa técnica kkk.
É o seguinte, preciso preencher um vetor com números aleatórios. Só que cada número sorteado tem um custo envolvido. Isso significa que, por exemplo, o custo da quantidade de números 1 presentes no meu vetor não pode ultrapassar um determinado orçamento. Eu quero fazer essa avaliação já no momento que eu estou inserindo um número. Meu vetor inicialmente tem zeros, sorteado o primeiro número, eu chamo a função verifica custo, que verifica o custo deste número. Se o custo for maior que o orçamento, então ela deve sortear outro número e verificar o custo novamente. E isso deve ser feito até que o custo não ultrapasse o orçamento. Se não ultrapassar, então ela deve me retornar esse número para que eu o coloque no vetor, e começo em outra posição todo o processo novamente.

    //Cria um indivíduo de forma aleatória
   public int[] individuo() {
            int[] S = new int[this.N];
            int r;

        for (int i = 0; i < this.N; i++) {
            r = random.nextInt(this.P) + 1;//Sorteia um número entre 1 e P, incluindo estes 
            S[i] = r;//insere esse número no meu vetor
            S[i] = verificaCusto(r, S, i);//Chama a função verificaCusto() para validar esse número
        }
        return S;
    }

//verifica se a quantidade desse número presente no vetor não ultrapassa o orçamento
public int verificaCusto(int r, int[] S, int i) {
    double c;
    c = custo(r, S);

    if (c <= this.O) {
        return r;
    }else{
        r = random.nextInt(this.P) + 1;//sorteia outro número, porque o anterior foi  reprovado
        S[i] = r;//insere no vetor
        return verificaCusto(r, S, i);//verifica o custo deste novo número.
    }       
}

O erro é de estouro de pilha, acredito eu.
Exception in thread “main” java.lang.StackOverflowError

StackOverflowError é um indício de que você está chamando a função tantas vezes que a memória disponível para o java se esgota.
Eu entendo que você queira usar recursão, mas não é necessário.

Percebi que eu devo acrescentar mais uma condição. Pode ser que aconteça que o número sorteado sempre ultrapasse o orçamento. Então eu decidi usar um while. Ou seja, fazer a função verificar o orçamento 10 vezes. Se não encontrar nada, eu retorno 0. Mas ainda estou errando na lógica da recursão. Preciso usar recursão, pois executarei os mesmos procedimentos 10 vezes. Sei que é um problema bobo, fácil de resolver, mas meus neurônios já estão fritos, pois isso é apenas parte de um algoritmo genético que sou obrigada a programar, não consigo mais raciocinar, por isso recorri ao fórum, sei que existe um gênio por aqui. Me ajudem, já me humilhei para um monte de gente na faculdade, mas ninguém tem competência para isso kkkkk. Não é possível que uma recursão fará me reprovar…:sleepy::pleading_face::cold_sweat::weary::sob::sob:
Essa é a nova lógica que eu inseri.

//verifica se a quantidade desse número presente no vetor não ultrapassa o orçamento
    public int verificaCusto(int r, int[] S, int i) {
        int j = 0;
        double c;
        c = custo(r, S);

        if (c <= this.O) {
            return r;
        } else {
            while (j < 10) {
                r = random.nextInt(this.P) + 1;//sorteia outro número, porque o anterior foi  reprovado
                S[i] = r;//inseri no vetor
                j++;
                verificaCusto(r, S, i);//verifica o custo deste novo número.
            }
            return 0;
        }
    }