Para aprender algo novo, devemos esquecer conceitos antigos
IF
IF Instituto Federal
Variável
Variável O humor da sua esposa, marido, namorado, rolo... etc
For
For Aquele filme da Marvel
Ok, agora que apagamos conceitos errados
Qual o resultado de F(x) = x + x onde f(2)
Qual o resultado de F(x) = x + x onde f(2) 3
Qual o resultado de F(x) = x + x onde f(2) 4
f(x) = x + x
f(2) = 2 + 2
f(2) = 2 + 2 ∴ 4
f(x) = if x = 2 then 4 else x + 5
f(2) = if 2 = 2 then 4 else 2 + 5
f(2) ∴ 2
f(x) = if x > 0 then x + f(x - 1) else x
f(2) = if 2 > 0 then 2 + f(2 - 1) else 2
f(2) = if 2 > 0 then 2 + f(2 - 1) else 2 ∴ f(2) = if 2 > 0 then 2 + (if 2 - 1 > 0 then (if 2 - 1 - 1 > 0 then ... else 2 - 1 - 1) else 2 - 1) else 2
Ops... bom, daí temos a otimização de rabo...
A otimização de rabo é quando enfiamos os ... e otimizamos as chamadas, pois já sabemos que ela bateu na condição
Falando em rabo
se isso fosse uma centopéia: [0, 1, 2, 3, 4]
[0] = cabeça [1, 2, 3, 4] = rabo...
0 é a cabeça e o resto é o rabo ∴ f(x) = let h = cabeça(x), t = rabo(x) in if t != [] then h + f(t) else h
mas...eita.. e se...
f([cabeça : rabo]) = if rabo != [] then cabeça + f(rabo) else cabeça
mas...ainda da pra mais
f [] = 0
f cabeça = cabeça
f [cabeça : rabo] = cabeça + f(rabo)