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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2016, 19:17   #1
o.m.f.g.
 
Регистрация: 24.03.2016
Сообщений: 4
Восклицание Рекурсия

Доброго времени суток:
Помогите, пожалуйста, разобраться с рекурсией:

Дан код:
Код:
procedure f(n:integer);
begin
writeln('*');
if n > 0 then begin
writeln('*');
f(n-2);
f(n-2);
f(n div 2);
end
end;
begin
f(6);
end.
Сколько символов '*' будет напечатано в результате?
Понятно, что можно вбить в компилятор и посмотреть, но хотелось бы понять каким образом проход рекурсия здесь. Если можно прям по шага, что-куда идет и как проходит рекурсия. Спасибо
o.m.f.g. вне форума Ответить с цитированием
Старый 24.03.2016, 19:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
f(6); вход
	write(*);
	6>0
	write(*)
	f(6-2); =f(4);вход
		write(*);
		4>0
		write(*)
		f(4-2); =f(2);вход
			write(*);
			2>0
			write(*)
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2 div 2); =f(1); вход
				write(*);
				1>0
				write(*);
				f(1-2); =f(-1);вход
					write(*);
					-1>0
				f(-1); выход
				f(1-2); =f(-1);вход
					write(*);
					-1>0
				f(-1); выход
				f(1 div 2); =f(0);вход
					write(*);
					0>0
				f(0); выход
			f(1); выход
		f(2); выход
		f(4-2); =f(2);вход
			write(*);
			2>0
			write(*)
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2 div 2); =f(1); вход
				write(*);
				1>0
				write(*);
				f(1-2); =f(-1);вход
					write(*);
					-1>0
				f(-1); выход
				f(1-2); =f(-1);вход
					write(*);
					-1>0
				f(-1); выход
				f(1 div 2); =f(0);вход
					write(*);
					0>0
				f(0); выход
			f(1); выход
		f(2); выход
		f(4 div 2); =f(2); вход
			write(*);
			2>0
			write(*)
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2 div 2); =f(1); вход
				write(*);
				1>0
				write(*);
				f(1-2); =f(-1);вход
					write(*);
					-1>0
				f(-1); выход
				f(1-2); =f(-1);вход
					write(*);
					-1>0
				f(-1); выход
				f(1 div 2); =f(0);вход
					write(*);
					0>0
				f(0); выход
			f(1); выход
		f(2); выход
        f(4);выход
	f(6-2); =f(4);вход
		write(*);
		4>0
		write(*)
		f(4-2); =f(2);вход
			write(*);
			2>0
			write(*)
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2 div 2); =f(1); вход
				write(*);
				1>0
				write(*);
                                f(1-2); =f(-1); вход  вход только обозначен НЕТ выхода (см. P.S.)
                                f(1-2); =f(-1); вход
                                f(1 div 2); =f(0); вход
			f(1); выход
		f(2); выход
		f(4-2); =f(2);вход
			write(*);
			2>0
			write(*)
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2 div 2); =f(1); вход
				write(*);
				1>0
				write(*);
                                f(1-2); =f(-1); вход
                                f(1-2); =f(-1); вход
                                f(1 div 2); =f(0); вход
			f(1); выход
		f(2); выход
		f(4 div 2); =f(2); вход
			write(*);
			2>0
			write(*)
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2-2); =f(0);вход
				write(*);
				0>0
			f(0); выход
			f(2 div 2); =f(1); вход
				write(*);
				1>0
				write(*);
				f(1-2); =f(-1);вход
				f(1-2); =f(-1);вход
				f(1 div 2); =f(0);вход
			f(1); выход
		f(2); выход
        f(4);выход
	f(6 div 2); =f(3); вход
		write(*);
		3>0
		write(*)
		f(3-2); =f(1);вход
			write(*);
			1>0
			write(*)
			f(1-2); =f(-1);вход
			f(1-2); =f(-1);вход
			f(1 div 2); =f(0); вход
		f(1); выход
		f(3-2); =f(1);вход
			write(*);
			1>0
			write(*)
			f(1-2); =f(-1);вход
			f(1-2); =f(-1);вход
			f(1 div 2); =f(0); вход
		f(1); выход
		f(3 div 2); =f(1); вход
			write(*);
			1>0
			write(*)
			f(1-2); =f(-1);вход
			f(1-2); =f(-1);вход
			f(1 div 2); =f(0); вход
		f(1); выход
        f(3);выход
f(6);выход
как-то так если не напутал
но НЕ до конца!!!!
там где нет выхода на том же уровне!!!
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.03.2016 в 20:02.
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия victor5133 Общие вопросы C/C++ 3 26.04.2012 13:22
Рекурсия в C++ 2008_student_2013 Помощь студентам 2 16.04.2012 21:07
рекурсия Lena neznayka Помощь студентам 2 16.06.2010 20:46
Рекурсия Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:28
рекурсия misha25525 Помощь студентам 4 25.03.2010 18:57