Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Ricorsione con fibonacci particolare

    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.

    codice:
    #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));
        }
    }

  2. #2
    Carino come esercizio. Comunque, io capovolgerei tutto: così è molto più efficiente, è un'unica funzione e rimuove completamente l'iterazione, sostituita con la sola ricorsione:
    codice:
    #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:
    codice:
    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;
        }
    }
    Ultima modifica di MItaly; 14-12-2016 a 01:25
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.