140 likes | 370 Views
Сьогодн і на уроці. Рекурс ія. Урок №6. Поняття підпрограми. 10-В клас 12.04.2013. Розглянемо приклад рекурсивного виклику на обчисленні степеня числа х^n , де х - будь-яке дійсне число, а n - ціле , додатне число. Постає питання , коли і як припинити цей процес
E N D
Сьогодні на уроці Рекурсія Урок №6. Поняття підпрограми. • 10-В клас12.04.2013
Розглянемо приклад рекурсивного виклику на обчисленністепеня числа х^n, де х - будь-якедійсне число, а n - ціле, додатне число. Постаєпитання, коли і як припинитицейпроцес Тобто рекурсивна функція для обчисленнястепеня числа буде матинаступнийвигляд: FunctionStep(x:real; n:integer):real: BeginIfn = 0 then Step:=1 elseStep:=Step(x,n-1)*x; End; Проаналізуємо роботу цієїфункції на прикладізнаходженнязначення 2,3. При першомувикликуфункціїзначеннязмінних буде дорівнювативідповідно:x = 2n = 3.Так як значенняn не дорівнює 0 спрацюєгілкаelse, тобтопочневиконуватисьтакий операторStep:=Step(x,n-1)*x;де x буде дорівнювати 2, іn - теж 2.
{ №2.Обчислення степенізнатуральнимпоказником. } uses crt; vary,rez:real; n:integer; function stepen(k:integer; x:real):real; begin if k=0 then stepen:=1 else stepen:=x*stepen(k-1,x); end; begin clrscr; writeln('Введітьосновустепені: x='); readln (y); writeln('Введітьпоказникстепені: k='); readln (n); • rez:=stepen(n,y)ж • writeln ('x встепені k=‘,rez); end.
Умова:Знайтинайбільшийспільнийдільникдвохнатуральних чисел n та m за алгоритмом Евкліда: В даномувипадкуумовоювиходузрекурсії буде рівністьдвох чиселn=m.
№3. Обчислення НСД(алгоритм Евкліда) Uses crt; Varx,y:integer; FunctionNSD (n,m:integer):integer; begin if n=mthen NSD:=n Elseif n>mthen NSD:=NSD(n-m,m) else NSD:=NSD(n,m-n); end; BeginClrscr; writeln (‘введіть два числа: '); readln (x,y); writeln (‘НСД -> ',NSD(abs(x),abs(y))); End.
Uses crt;{Factorial} VarRez:longint; i:integer; functionFactorial (n: integer): integer; begin if n> 0 then Factorial:= Factorial (n-1) * n else if n = 0 then Factorial:= 1 else writeln(‘значенняn менше0') end; Begin Clrscr; For i:=1 to 4 do begin Rez:=Factorial(i); end; writeln('Rezultat -> ',Rez); End.
Умова:Використовуючипідпрограмуобчисленняфакторіалу, розробитипрограмуобчисленнясумифакторіалівусіхцілих чисел від 1 до 10.Функціяобчисленняфакторіалуєчи не найстандартнішою, яку приводять в усіхпідручниках для поясненняявищарекурсії. Тодівихіднапрограма буде матинаступнийвигляд:
Procedure Factorial(N:integer; Var F:Extended); • Begin • If N<=1 Then F:=1 ElseBeginFactorial(N-1, F); F:=F*N End End; FunctionFactorial(N:integer):Extended; BeginIf N<=1 Then Factorial:=1 ElseFactorial:=Factorial(N-1)*N End;
Uses crt; VarRez:longint; i:integer; Function Factorial (n:integer):longint; Begin if n=0 then Factorial:=1 else Factorial:=Factorial(n-1)*n; End; Begin Clrscr; rez:=0; For i:=1 to 10 do begin Rez:=rez+Factorial(i); end; writeln('Rezultat -> ',Rez); End.
Складітьпрограму, яка б обчислилаперші N чисел Фібоначчі. Знайдіть за допомогоюпрограми 15-е число Фібоначі. uses crt; varn,y:integer; Function Fib(k:integer):integer; begin if k<3 then Fib:=1 else Fib:=Fib(k-1) + Fib(k-2); end; begin clrscr; for n:=1 to 15 do begin Y:=fib(n); writeln(Y:5); end;end.
Підпрограми Це невелика за розміромлогічно завершена частинапрограми, яка маєунікальнеім’я і до якоїможназвернутисябагаторазів з різних місць програми. Прописують підпрограму в розділі опису та оголошень, тобто над основною частиною програми.
Для чого потрібна підпрограма? Досить часто при розв’язанні складних, об’ємних задач роблять розбивку на підзадачі, і кожна підзадача розв’язується окремо. Наприклад знаходження площі поверхні призми: знаходять площу основи, площу бічних граней, а потім знаходять суму площ.
Підпрограми Процедури Функції Без параметрів З параметрами