PDA

Visualizza la versione completa : [C] Ricorsione con fibonacci particolare


DiegoFilippo
14-12-2016, 00:00
Scrivere una funzione ricorsiva (e un main che la testa, chiedendo un intero positivo n all'utente) che stampi i primi n valori divisibili per 3 della serie di Fibonacci.


Non sono riuscito a scrivere una funzione ricorsiva che faccia tutto in un unica funzione, quindi ne ho create tre diverse, ma penso di non avere (a questo punto) completato correttamente l'esercizio. Cioè il codice stampa quanto richiesto, ma per un'latra via. mi servirebbe un suggerimento su come "inglobare" le tre funzioni in una.


#include<stdio.h>
#include<conio.h>

int fibonacci(int n);
int div_tre(int n);
void stampa(int n);

int main()
{
int n;

printf("Inserisci un numero\n");
scanf_s("%d", &n);

stampa(n);

printf("TERMINATO");

_getch();
return 0;
}

int fibonacci(int n)
{
if (n == 0 || n == 1)
return 1;
else if (n > 1) {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}

int div_tre(int n)
{
if (n % 3 == 0)
return 1;
else if (n % 3 != 0)
return 0;
}

void stampa(int n)
{
int i = 0;

for (i = 0; i < n; i++)
{
if (div_tre(fibonacci(i)))
printf("%d\n", fibonacci(i));
}
}

MItaly
14-12-2016, 01:23
Carino come esercizio. :) Comunque, io capovolgerei tutto: così è molto più efficiente, è un'unica funzione e rimuove completamente l'iterazione, sostituita con la sola ricorsione:


#include <stdio.h>

void fibo3(int tofind, int prev=1, int cur=1) {
if(tofind==0) return;
int next = cur + prev;
if(next%3==0) {
printf("%d\n", next);
tofind--;
}
fibo3(tofind, cur, next);
}

int main() {
int tofind = 0;
scanf("%d", &tofind);
fibo3(tofind);
return 0;
}


Noterai che di fatto è la versione ricorsiva di:


void fibo3(int tofind) {
int prev = 1, cur = 1;
while(tofind!=0) {
int next = cur + prev;
if(next%3==0) {
printf("%d\n", next);
tofind--;
}
prev = cur;
cur = next;
}
}

Loading