Devolva

Esse comando é utilizado para indicar um valor a ser devolvido por uma função. O tipo do dado a ser devolvido tem se compatível com o tipo declarado da função, por exemplo, uma função declarada do "tipo inteiro" tem que devolver um valor inteiro. Vide chamada de função.

Uma vez que o comando devolva é encontrado, a execução da função é interrompida, retornando a execução para o ponto imdiatamente após o ponto em que foi invocada. O código na figura 1 ilustra isso: usar a função fatorial para computar a combinação de n elementos, tomado-se apenas k deles (combinação de n, k-a-k).

Sabemos que para a combinação de n, k-a-k é n!/((n-k)!*k!).

A figura 1 apresenta o código ilustrando os pontos de retornos para as 3 chamadas da função fatorial, dentro do comando escreva, com a expressão fatorial(n) / (fatorial(aux) * fatorial(k)). Primeiro é computado fatorial(n) e seu ponto de retorno está indicado pela seta laranja 1, depois é computado fatorial(aux) (note que o iVProg só permite uma variável como parâmetro daí usou-se aux = n-k) e seu ponto de retorno está indicado pela seta laranja 2, por último computa-se fatorial(k) (retorno indicado pela seta 3), com o último resultado completa-se o cálculo e o valor final será impresso.

       
        Fig. 1. O comando escreva invoca fatorial(n), depois fatorial(n-k) e por últim fatorial(k).

Para quem deseja saber mais: Para cada uma das k posições, pode-se tomar qualquer dos n elementos, o que resultaria F=n*(n-1)*(n-2)*...*(n-k+1) = n!/(n-k)! sequências distintas (de k elementos);
Entretanto no valor F aparecem k! cópias de cada lista com k elementos (suas permutações), então o resultado final deve ser dividido por k! resultando na expressão acima.

O código abaixo (em Portugol) é o correspondente textual ao código visual na figura 1.


Portugol. Código textual correspondente

programa {
  funcao vazio inicio (  )  {
    inteiro n <- 0
    inteiro k <- 0
    inteiro aux <- 0
    leia(n)
    leia(k)
    aux <- n - k
    escreva(fatorial(n) / (fatorial(aux) * fatorial(k))), "\n")
    }
funcao inteiro fatorial (inteiro pn) {
    inteiro fat <- 1
    inteiro i <- 2
    enquanto_verdadeiro (i <= pn) {
      fat <- fat * i
      i <- i + 1
      }
    devolva fat
    }
  }