Enfoque en Java (Imperativo)¶
import java.util.LinkedList;
public class Cosita {
public long factorial(int n){
if (n==0){
return 1L;
}
else{
return n*factorial(n-1);
}
}
public LinkedList<Long> listaFactoriales(int n){
LinkedList<Long> lst = new LinkedList<Long>();
for(int i=0; i<=n; i++){
lst.add(factorial(i));
}
return lst;
}
public static void main(String[] args) {
Cosita objCosita = new Cosita();
System.out.println(objCosita.factorial(4));
System.out.println(objCosita.factorial(20));
System.out.println(objCosita.listaFactoriales(20));
}
}
Elementos
- Asignación lst.add (modifica la lista)
- Estructura iterativa for(int .....)
- Retornos return (break, continue)
Enfoque en PF¶
/*
* This Scala source file was generated by the Gradle 'init' task.
*/
package taller
object App {
def factorial(n: Int): Long = {
if (n == 0) 1L
else n*factorial(n-1)
}
def generador(i: Int, f:Int):List[Int] = {
if (i == f) List(i)
else i :: generador(i+1,f)
}
def listaFactoriales(n:Int):List[Long] ={
generador(0,n).map(factorial)
}
def main(args: Array[String]): Unit = {
println(factorial(4))
println(factorial(20))
println(generador(0, 10))
println(listaFactoriales(20))
}
}
- Valores inmutables (no uso de asignación)
- Las funciones son valores que pueden ser creados (def), compuestos cuando listaFactoriales llama generador o invocados listafactoriales(20)
- Funciones como ciudadanos de primera clase (valores) una función puede ser enviada como parametro map(factorial)
- Toda expresión debe ser un valor por esta razón no tenemos return, break o continue