Stamattina ho dovuto trovare qualcosa per tenere impegnati due studenti venuti in azienda per l’alternanza scuola/lavoro. Visto che a scuola, oltre a Java, stanno studiando anche un po’ di linguaggio C, gli ho dato un computer con Kali Linux e gli ho chiesto di provare a fare un programmino per prendere confidenza con un editor di testo e con il compilatore gcc
.
La prima cosa semplice che mi è venuta in mente è stata la successione di Fibonacci, quindi avrei voluto fargli scrivere un semplice programma che, dato in input un intero N, calcolasse il valore N-esimo della successione.
Dato che a scuola non gli hanno ancora spiegato la ricorsione, gli ho chiesto di risolvere il problema con un algoritmo iterativo, ma la cosa buffa è che lì per lì nemmeno io avevo in mente come risolvere il problema senza ricorrere alla… ricorsione. Quindi ho virato su una cosa più semplice, ovvero il calcolo del fattoriale.
Una volta a casa, dopo cena, invece di rilassarmi e andarmene a letto dopo l’ennesima notte insonne, ho pensato bene che non potevo andare a dormire portando con me il peso e la vergogna di questo problema irrisolto; quindi ho preso carta e matita e, ragionando con calma per qualche minuto, ho scritto la funzione iterativa che calcola il valore della successione di Fibonacci per un dato valore N.
Niente di speciale, è un problema da quarta elementare, ma ragionarci sopra per un po’ mi ha fatto rendere conto che ho perso l’abitudine di risolvere i problemi e, complice l’insonnia che mi perseguita da diversi anni, il mio cervello ha iniziato ad arrugginirsi in maniera piuttosto evidente.
int fibonacci(int n) {
int f0 = 0;
int f1 = 1;
if (n == 0) return f0;
if (n == 1) return f1;
int fx;
for (int x = 2; x <= n; x++) {
fx = f0 + f1;
f0 = f1;
f1 = fx;
}
return fx;
}
Code language: C/AL (cal)
PS: il syntax highlight per il linguaggio C fa un po’ schifo… Ah, non ho messo il controllo sul valore di n
passato alla funzione, quindi passando un valore negativo va in overflow… 😀
PS2: in realtà il controllo sull’input lo facevo nel main
, ma ovviamente non va omesso nemmeno nella funzione…
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Sintassi: %s N (con N>=0)\n", argv[0]);
return -1;
}
int f = atoi(argv[1]);
if (f < 0) {
printf("Devi inserire un numero maggiore o uguale di zero!\n");
return -1;
}
printf("Il valore di F(%d) vale: %d\n", f, fibonacci(f));
return 0;
}
Code language: C/AL (cal)
Vabbè, sono una capra! 😛