Rekurencja - czemu nie działa?

0

Jestem początkujący i właśnie uczę się rekurencji. Próbuję zrobić ciąg fibonaciego, ale nie wiem jak na prawić błędy. Zszedłem już z 11 do 6 błędów i proszę o pomoc. Nie chcę rozwiązania! Naprowadźcie mnie tylko, gdzie jest błąd SKŁADNI w kodzie.

/** 
 * ciąg fibonaciego rekurancyjnie
 * #param x: indeks ciągu fibonaciego jaki chcemy otrzymać
*/
public class HelloWorld{
    
//zwraca wartosc ciagu fibonaciego dla x-tego elementu ciagu
    static int getFibonacci(int x){
    if (x<=2){
        return 1;
    }else{
    return getFibonacci(x-1) + getFibonacci(x-2);
   
    }
}

     public static void main(String []args){
        System.out.println(getFibonacci(8));
     }
}

0

Poprawiłem kodwg sugestii lion123 oraz usunalem polskie znaki z komentarzy. Teraz próbuję dodać obsługę błędów (jakby ktoś stringa wprowadził) i nie dizała, nie wiem czemu:

 /** 
 * ciag fibonaciego rekurancyjnie
 * #param x: positive integer, indeks ciagu fibonaciego jaki chcemy otrzymac
*/
public class HelloWorld{
    
//zwraca wartosc ciagu fibonaciego dla x-tego elementu ciagu
    static int getFibonacci(int x){
    if (x<=0){
        return 0;
    }else if(x==1){
        return 1;
    }else{
    return getFibonacci(x-1) + getFibonacci(x-2);
   
    }
}

     public static void main(String []args){
          try{
             int result = getFibonacci("yyyy");
             System.out.println(result);
             }catch(NumberFormatException e){
                 System.out.println("zly format liczby");
             }
        
        
     }
}

0

Bo nie możesz wywołać funkcji która przyjmuje int z jakimś argumentem String. To się na szczęście w ogóle nie kompiluje. Poprawność formatu sprawdź w miejscu, gdzie pobierasz dane i tam się upewnij, że format jest odpowiedni.

1

Jakj Dasz warunek x < 2, to tworzy ciąg 1, 1, 2, 3, ..., a jak x ==0 -> 0 lub x == 1 -> 1 to tworzy 0,1,1,2, 3,.. Ale ogólnie algorytm jest OK, chociaż za wydajny to on nie jest:)

1

W przypadku wprowadzania stringa nie musisz używać try-catch, tutaj wychwyci to za ciebie kompilator i powie że funkcja która oczekuje inta nie przyjmie stringa. Jedyny sens jaki tutaj widzę w użyciu try-catch to sprawdzenie czy nie próbujesz policzyć wartości ciągu dla ujemnego indeksu, tj przekazujesz do funkcji wartość ujemną. Co prawda masz w funkcji zabezpieczenie przed takim zdarzeniem, ale o ile mi wiadomo ciąg Fibonacciego nie ma elementów o ujemnych wartościach indeksów.

1

Obsługa wyjątków w tym programie ma sens tylko wtedy, gdy pytasz użytkownika o numer wyrazu - użytkownik może wpisać głupoty.

     public static void main(String []args){
          Scanner scanner = new Scanner(System.in);
          System.out.print("Który wyraz policzyć? ");
          try{
             int index = scanner.nextInt();
             int result = getFibonacci(index);
             System.out.println(result);
             }catch(NumberFormatException e){
                 System.out.println("zly format liczby");
             }
 
     }
1

Pewnie nie dopisałeś instrukcji importu

import java.util.Scanner;

Nie używasz żadnego IDE? IDE samo dopisze brakujące importy

1

NumberFormatException wziąłem z Twojego kodu, zamień na InputMismatchException.
W Eclipse masz Source => Organize imports, dopisuje potrzebne i usuwa zbędne importy.

1

Napisałeś (o poleceniu importu)
a, trzeba było bibliotekę dodać.
Polecenie importu nie jest analogiem polecenia include z języka C i nie dodaje żadnej biblioteki. Polecenie importu pozwala na używanie krótkich nazw klas. Poniższe kody są równoważne:

import java.util.Scanner;
public class Test
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
    }
} 
public class Test
{
    public static void main(String[] args)
    {
        java.util.Scanner scanner = new java.util.Scanner(System.in);
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1