2013-04-18 3 views
1

Я пытаюсь напечатать серии Фибоначчи, используя рекурсию, и мой код не заканчивает рекурсию. Можете ли вы сказать мне, если я пропустил something.I думаю, что второй рекурсии происходит в бесконечный цикл и я не могу понять, почему это происходитПечать серии фибоначчи в рекурсии

class Main 
{ 
    public static void main (String[] args) 
    { 
     int k=7; 
     int x=0,y=1; 
     fib(x,y,k,0); 
     return; 

    } 

    public static void fib(int x,int y,int k,int cnt) 
    { 
     int z; 
     if(cnt>k) 
     return; 

     if(cnt<=k) 
     { 
      z=x+y; 
      x=y; 
      y=z; 
      System.out.println("value is"+z); 

      fib(x,y,k,cnt++); 

     } 

    } 
} 
+0

Если вы пытаетесь изучить рекурсию, вам следует рассмотреть подход Imran, описанный ниже. Решение, которое вы, в то время как технически рекурсивно, на самом деле не является «естественным» рекурсивным решением (оно «хвостовое рекурсивно» и поэтому его изменение на нерекурсивный цикл является тривиальным). Идея решения Имрана заключается в том, что (общее) определение числа Фибоначчи само рекурсивно (оно использует числа Фибоначчи в определении!). Естественное рекурсивное решение воспользовалось бы этим. Следовательно, 'fib (n) = fib (n-1) + fib (n-2)' - это определение ... а также (псевдо) код. – rliu

ответ

1

Этот вопрос является сообщение -increment в:

fib(x,y,k,cnt++); 

Это проходит первоначальное значение cnt к рекурсивному вызову, а затем увеличивает его.

Если вы печатаете значение cnt в начале fib(), вы увидите, что оно всегда равно нулю.

Одно легко исправить, чтобы изменить этот вызов

fib(x,y,k,cnt+1); 

Кроме того, ваша нумерация чисел Фибоначчи немного странно (я бы сказал, что седьмой номер 8 и код думает, что это 34).

Наконец, мне, возможно, стоит отметить, что второй if не нужен.

+0

Спасибо .. я бы попробовал это –

1

Вы, кажется, не понимаете понятие числа Фибоначчи. Пожалуйста, прочитайте wikipedia article. Ниже приведен код этой функции.

public static int fib(int n) 
{ 
    if(n == 0 || n == 1) 
     return n; 

    return fib(n-1) + fib(n-2); 
} 
+0

Вы можете распечатать цифры перед последней строкой функции для печати серии. –

+1

Я не согласен с приведенным выше комментарием – bearMountain

+0

@Imran S Не следует ли возвращать 1 вместо возврата n? – user2441441

Смежные вопросы