Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 16:43   #1
Pawel
 
Регистрация: 30.07.2010
Сообщений: 7
По умолчанию

Доброго времени суток!
Сделал программу генерации чисел Фибоначчи с помощью рекурсии, и она их генерирует, но перед этим выводит всякие промежуточные данные.
Вот, собственно, код:
Код:
public class Fibon {
    public int fib(int n) {
    	int f;
    	if (n <= 0) {
    	    f = 0;  		
    	} else if (n == 1 || n == 2) {
    	    f = 1;    			    	
	} else {	    	
	    f = fib(n - 2) + fib(n - 1);	    		
	}
	System.out.print(f + " ");	    
	return f;    		
    }
    
    public static void main(String[] args) {
        new Fibon().fib(5);
    }
}
А вот результат: 1 1 2 1 1 1 2 3 5
Хотя должно быть только 1 1 2 3 5
Я так понимаю, лишний вывод происходит из-за того, что в методе 2 раза используется рекурсия, но не представляю, как это исправить.
Пожалуйста, помогите разобраться!

Вычитал, что для устранения повторных вычислений надо применить рекурсию с запоминанием. Возможно, кто-нибудь подскажет, как это сделать и что это вообще такое?

Последний раз редактировалось Stilet; 20.04.2011 в 10:25.
Pawel вне форума Ответить с цитированием
Старый 21.04.2011, 11:37   #2
Pawel
 
Регистрация: 30.07.2010
Сообщений: 7
По умолчанию

Спасибо, Господа, за ценные предложения (которые, к сожалению, Вы так и не высказали)! Разобрался сам. Вот код, если кому интересно:
Код:
public class Main {
    private static int [] fn = new int[100];

    static int fib(int x) {
        if (fn[x] == 0) {
            if (x == 1 || x == 2) {
                fn[x] = 1;
            } else {                
                fn[x] = fib(x - 2) + fib(x - 1);
            }
            System.out.println(fn[x]);
        }
        
        return fn[x];
    }

    public static void main(String[] args) {
	fib(5);
    }
}
Рекурсия с запоминанием тут получается благодаря массиву fn.
Pawel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться с рекурсией...как это сделать? Lain30 Помощь студентам 3 02.01.2011 16:28
хочу разобраться в графических режимах sinj Общие вопросы C/C++ 6 26.08.2010 22:34
Хочу разобраться с PageControl ANNA23 Помощь студентам 4 19.06.2010 18:18
Помогите. Хочу разобраться PEHAT Помощь студентам 2 13.05.2009 21:19
помогите разобраться с рекурсией с++ l.e.n.a Помощь студентам 1 10.02.2009 20:32