0% found this document useful (0 votes)
10 views14 pages

Recursion

The document discusses recursion, defining it as a process where a function calls itself to solve problems by breaking them down into smaller subproblems. It outlines the properties, features, advantages, and disadvantages of recursion, along with examples such as factorial and Fibonacci functions. Additionally, it covers types of recursion, including simple, multiple, mutual, and nested recursion, as well as the mechanics of function calls in a recursive context.

Uploaded by

ymenter
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
10 views14 pages

Recursion

The document discusses recursion, defining it as a process where a function calls itself to solve problems by breaking them down into smaller subproblems. It outlines the properties, features, advantages, and disadvantages of recursion, along with examples such as factorial and Fibonacci functions. Additionally, it covers types of recursion, including simple, multiple, mutual, and nested recursion, as well as the mechanics of function calls in a recursive context.

Uploaded by

ymenter
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

Higher School in Computer Science

Chapter III : Recursion


and Digital Technologies Definition
❑ What is recursion
The process in which a function calls itself directly or indirectly is
called recursion and the corresponding function is called a recursive
Chapter III: Recursion function. Using a recursive algorithm, some problems can be solved
quite easily.

Algorithmics and Dynamic Data


Structures A recursive function solves a particular problem by calling a copy of
itself and solving smaller subproblems of the original problems.

1st year preparatory class, ESTIN, Bejaia


Dr. Lamia CHEKLAT

Year : 2024 - 2025 Dr. Lamia CHEKLAT


2

Chapter III : Recursion Chapter III : Recursion


Definition Definition
❑ Properties of Recursion ❑ Features of Recursion
— Breaking down the main problem into smaller sub-problems, each of
Advantages :
which can be solved in the same way.
— Simplifies complex problems by breaking them down into smaller,
— A recursive function must have a base case or stopping criteria more manageable pieces.
to avoid infinite recursion.
— Recursion involves calling the same function within itself, which — Essential for some algorithms and data structures. Sometimes, its
leads to a call stack. easier to think in recursive way than in an iterative.

— Recursive functions may be less efficient than iterative solutions in — Reduces the length of code and becomes more readable and
terms of memory and performance. understandable to the user/ programmer.

3 4
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Definition Definition
❑ Features of Recursion ❑ Approach of Recursion
Disadvantages : A recursive function is defined by:
▪ at least one base case and,
— Their execution is occasioned by a considerable loss of time, and ▪ at least one general case.
calls for the use of stacks;This leads to excessive memory usage.
— Basic Case: describes cases where the result of the function is
— Recursive functions can be more challenging to debug and simple to calculate: the value returned by the function is directly
understand than iterative solutions. defined.
— General case: The function is called recursively, and the returned
— Recursion can lead to stack overflow errors if the recursion depth
result is obtained using the result of the recursive call. With each
is too high.
recursive call, the value of at least one of the function’s parameters
must change.

5 6
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Exemples of recursion Exemples of recursion
❑ Exemple 01 : Factorial ❑ Exemple 01 : Factorial
Consicder the mathematical function 'factorial' defined for any positive ▪ The iterative version of the factorial function :
integer n as follows :
=
!= Function Fact ( n : integer) : integer
∗ − ! >
Var i : integer
As we can see, this function is self-defining. It considers the trivial case
where n = 1, and for which 1! = 1, and set the values of n! as the Begin
product of n and (n -1)!. Fact ← 1
For i from 1 to n Do
Indeed, if we want to calculate 4! For example, we would just have to Fact ← Fact*i
multiply 4 by 3!, and therefore have to calculate 3!, and so on. That is to EndIF
say: 4! = 4 * 3! End
= 4 * (3 * 2!)
= 4 * (3 * (2 * 1!))
= 4 * (3 * (2 * 1 )) = 24.
7 8
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Exemples of recursion Exemples of recursion
❑ Exemple 01 : Factorial ❑ Exemple 02 : Fibonacci sequence
▪ The recursive version of the factorial function : The Italian mathematician Leonardo Fibonnacci defined the
Function FactRec( n : integer) : integer sequence that bears his name as follows:
Begin <
( )=
If (n = 1) Then − + − ≥
FactRec ← 1
Else As we can see, the Fib function has a trivial case; whe n is less
FactRec ← n* FactRec(n-1) than 2, and a general case for n greater than or equal to 2.
EndIf
End For example :
Fib(4) = Fib(3) + Fib(2)
Notice that the FactRec function calls itself until it ends with = (Fib(2) + Fib(1)) + (Fib(1) + Fib(0))
the trivial case (1!). = ((Fib(1) + Fib(0)) + Fib(1)) + (Fib(1) + Fib(0))
= ((1 + 1) + 1) + (1 + 1) = 5
9 10
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Exemples of recursion Exemples of recursion
❑ Exemple 02 : Fibonacci sequence ❑ Exemple 02 : Fibonacci sequence
▪ The iterative version of the Fibonacci function : ▪ The recursive version of the Fibonacci function :
function Fibo ( n : integer) : integer Function Fib ( n : integer) : integer
Var x,y,U: integer
Begin Begin
x ← 1; y ← 1 If (n < 2) Then
Fib ← 1
For i from 2 to n Do Else
U ← x+y Fib ← Fib(n-1)+Fib(n-2)
x ← y EndIf
y ← U End
EndFor
Return U
End
11 12
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Principal of recursion Exercises
❑ Rules ❑ Exercise 01
Recursion makes it easier to solve complex problems. It is often easier to
express the solution to a given problem with
sub-solutions similar to the one we are looking for that end in trivial cases 1)- Write a recursive function that returns the rest of the Euclidean
which are easy to express without recursion. division of an integer a by an integer b using successive subtractions.
To design recursive algorithms, we need to consider the following three
rules: 2)- Write a recursive function that calculates the sum of the first n
1) A recursive function must return a result for any valid input. integers ( S = 1+2+3+ ... +(n-1)+n)
2) A recursive function must define a trivial case that does not
perform recursive calls.
3) Recursive calls should be increasingly simple, and lead to the
trivial case.
13 15
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Exercises Exercises
❑ Exercise 01 : Solution ❑ Exercise 01 : Solution
Function SumRec (n : integer) : integer
Function RestDiv (a,b : integer): integer
Begin
Begin If (n < 1) Then
If ( a < b ) Then Return 0
RestDiv ← a Else
Else If (n = 1) Then
RestDiv ← RestDiv(a-b, b) Return 1
EndIf Else
End Return n + SumRec(n-1)
EndIf
EndIf
End
16 17
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Exercises Exercises
❑ Exercise 02 ❑ Exercise 02 : Solution
Ackermann's recursive function Ackermann's recursive function
Function Ackermann( n,m : integer) : integer
Let f be the function of N×N in N defined by: Begin
+1 =0 If ( n = 0 ) Then
f n, m = − 1,1 =0 ≥1 Return m+1
− 1, ( , − 1) ≥1 ≥1 Else
If (m = 0) Then
Return Ackermann(n-1,1)
1. Calculate f(1, 0); f(2, 0) and f(3, 0): Else
2. Write an Ackermann function that calculates the values of f. Return Ackermann(n-1, Ackermann(n,m-1))
EndIF
EndIf
End
19 20
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Types of recursion Types of recursion
Simple recursion Multiple recursion
When the subprogram contains a single recursive call, the When the subprogram contains more than one recursive call, the
recursion is simple. recursion is multiple.
≤ ; = = ;
❑ Exemple : ( )=
∗ −
❑ Exemple : ( , )=
, − + ( − , − )

Function FactRec( n : integer) : integer Function Combin( n,p : integer) : integer


Begin Begin
If(p = 0) OR (p = n) Then
Return 1
If (n = 1) Then Else
FactRec ← 1 Return Combin(n-1,p) + Combin(n-1,p-1)
Else EndIf
FactRec ← n* FactRec(n-1) End
EndIf 21 22
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
End
Chapter III : Recursion Chapter III : Recursion
Types of recursion Types of recursion
Mutual recursion Mutual recursion
Sometimes, it is possible for Subprogram A to use Subprogram B, which Function Even ( N : integer):Boolean
Begin
in turn uses Subprogram A. So, the call that starts from A reaches A If (N = 0) Then
again after passing through B, is called mutual recursion (cross- Return true Function Odd ( N : integer) : Boolean
recursion). Else Begin
If (N = 1) Then If(N = 0) Then
Return false Return false
❑ Example: Else Else
An example of mutual recursion is the recursive definition of even Return Odd(n-1) If (N = 1) Then
EndIf Return true
and odd numbers. A positive number n is even if n-1 is odd, a
EndIf Else
positive n number is odd if n-1 is even. The stopping conditions End Return Even(n-1)
are given by the values n=0, which is even, and n=1, which is odd. EndIf
EndIf
End

23 24
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Types of recursion Types of recursion
Nested recursion Tail and Non-Tail Recursion
When the subprogram contains nested recursive calls, the
recursion is Nested. A recursive subprogram is tail if it doesn’t contain any processing
after a recursive call.
❑ Example: Ackermann Function A recursive subprogram is non-tail if it contains processing after a
recursive call.
+1 =0
f n, m = − 1,1 =0 ≥1
− 1, ( , − ) ≥1 ≥1 Check the previous subprgrams and identify the type of recursion (tail
or non-tail).

25 26
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Notion of a function call Notion of a function call
Let be an instruction register (IR) that holds the instruction to be {Calling a Function}
Begin {Start of Main Program}
executed in a given program. {Part before calling func}

How does a function call work? Knowing that this called function is x ← 1 The main program has a runtime
y ← 2 context that it must resume when
located in a memory area that is not necessarily adjacent to the r ← func(x)
current instruction. {Part after call to func} the function func gives it back
… control.
To understand this mechanism, let's look at the following abstract x ← r + y
End
algorithm: {Calling a Function}
Begin {Start of Main Program}
{Part before calling func} The variables x and y must have the same values as before the function

x ← 1 func was called (if the function func fdoesn't change them).
y ← 2 When calling func(x) the values of x and y
r ← func(x) {Call to func}
{Part after call to func} are saved somewhere and then restored at the end of this call. The
… same goes for any parameters that the main program would have had.
x ← r + y
End
27 28
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Notion of a function call Notion of a function call
The process for calling a function is as follows:
{Execution steps of func}
{Execution steps of the main program}
— Part before the call to func. — Part before the call to func2.
— Save the variables and parameters of the main program. — Save Local Variables and Parameters of func.
— Pass x to func, and run func. — Pass z to func2, and execute func2.
— Restore the variables and parameters of the main program. — Restore local variables and parameters of func.
— Part after the call to func — Part after the call to func2.

In summary, if a main program calls a function func, which in turn


If the function func itself calls another func2 function, passing it a calls a second function func2, the operations must be executed in
variable z as a parameter.Then, the function func, will run as follows: the following order:

29 30
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Notion of a function call Notion of a function call
{Execution steps of the main program} If we analyze the order of saving variables before the call and
1. Part before the call to func. restoring them after, we will notice that the variables saved first
2. Save the variables and parameters of the main program. are the last ones to be restored. And those saved last are
3. Pass x to func, and run func. the first ones to be restored.
4.
{Execution steps of func}
a). Part before the call to func2
b). Save local variables and parameters of func.
c). Pass z to func2, and execute func2.
d). Restore local variables and parameters of func.
The principle of a
e). Part after the call to func
STACK
5. Restore the variables and parameters of the main program. →
6. Part after the call to func. →
31 32
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Notion of a function call Notion of a function call
❑ Return address ❑ Return address
{Calling a Function} When the func function func is
When a function is called, the program needs to know where to Begin {Start of Main Program}
resume execution in the calling function. {Part before calling func} called, the instruction register
… holds to the call operation r ←
x ← 1 func(x). Then, the value of the
Indeed, the instruction register, having been changed to hold the y ← 2
first instruction of the called function, must be reset to hold the r ← func(x) register is changed to hold first
{Part after call to func} instruction of the function
instruction following this call so that the calling function can …
continue its execution. x ← r + y func. Upon return from the
End function (after executing func),
the register should hold the
instruction that comes
immediately after the call to
func.
33 34
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Notion of a function call Notion of a function call
Data Zones Special case : recursion
❑ Return address
Each function has a Data Zone (DZ) which is a structure (record) that
includes :
The mechanism remains the same! It involves to imagine
multiple copies of this function to which we make calls.
— The parameters with which this function was called.
— The local variables of this function.
— The return address to the function that called it (calling function).
Calling a function involves:
❑ Example: Factorial
1- Pushing the Current Data Zone (CDZ) onto a stack.
Let's detail the factorial recursive function to understand these
2- Preparing the Data Zone (DZ) of the function to be called.
3- Executing the called function.
steps of saving and restoring state.
4- Returning to the return address.
5- Popping a Data Zone and considering it as the Current Data
Zone (CDZ).
35 36
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Notion of a function call Converting recursive algorithms to iteratives
Special case : recursion
Although recursion is a tool that allows us to describe solutions
❑ Example: Factorial
Function Fact(n:integer):integer to complex problems in a simple way, some languages do not
Var f,x : integer
Begin support recursion. Indeed, it is necessary to be able to convert a
The Data Zone (DZ) associated with
If (n <= 1) Then this function includes: recursive algorithm into one that is iterative (thus without any
f ← 1 — The calling parametre n.
Else recursive calls). To achieve this, we exploit the notion of Data
— The Local variable x.
x ← n -1
— The return address to the caller Zones (DZ), using our own stack.
f ← Fact(x)
f ← f * n subprogram.
EndIf
Return f Since the variable f is returned, it is not
End pushed onto the stack.

37 38
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Steps ❑ Conversion Steps
3) On each recursive call
It consists of reproducing the call steps seen previously.
a. Push the current DZ (CDZ) into the stack.
1) Define the DZ: this step involves defining the DZ content of the b. Prepare the call, and a DZ.
recursive function. (Call parameters, local variables, return address). c. Go to the function to run it.
4) After each return
2) Define call and return points : we must define the points (or
a. Retrieve the return address which is in the CDZ.
addresses) where the recursive function is called, and where it must return
b. Pop a DZ (That is to say restore the DZ of calling program).
to the calling program.
c. Connect to the return address retrieved in (a).

39 40
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Example ❑ Conversion Example
To better illustrate the steps cited above, let’s take back the example of the
factorial. Function Fact(n:integer):integer
Var f,x : integer
1. Define the DZ : the DZ structure contains the following elements. Begin The Data Zone (DZ) associated with
— The call parameter n. If (n <= 1) Then this function includes:
— The Local Variable x. f ← 1
— The calling parametre n.
—Return address to the calling program adr. Else
x ← n -1 — The Local variable x.
So we need to consider a stack whose elements would be DZs of this type. f ← Fact(x) Calling point — The return address to the
f ← f * n Return Point (RP1) calling subprogram (RP1 or RP2).
For the conversion of the recursive solution to an iterative one, we assume the EndIf
following variables: Return f Final Return Point (RP2)
— CDZ, the current DZ. End
— S , a stack whose elements are DZs.

41 42
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Example ❑ Conversion Example
Function Fact(n : integer) : integer
2. Define call and return points Var a, f: integer; S : stack; CDZ: DZ
The second step in the conversion process is to define the call and Begin
return points of the recursive function. CreateSrack(S)
We start with the starting point of the function, the trivial case. (The If CDZ.n ← n {Initialize the Current Data zone}
CDZ.adr ← 1 {Final Return Point address}
statement (If (n <= 1)), This specific point of the function is
Start: If (CDZ.n <= 1) Then {starting point}
important, since this is where we have to connect on each call. f ← 1
So let's call this point START. The call point is clear and made explicit by a ← CDZ.adr {Retrieve the return address}
recursive call. Pop(S, CDZ) {Restore the calling subprogram DZ}
As for the return points, we have two: If a = 1 Then {Return handling}
— The final return point, located at the Return f statement, is the return GoTo RP1 {Final Return Point}
point to the calling program. Let's label this point with label “RP2”. Else
— The return point of the recursive call, located just after the recursive GoTo RP2 {Recursive Call Return Point}
call. Let's label this point with label “RP1”.
Dr. Lamia CHEKLAT
43
Dr. Lamia CHEKLAT EndIf … 44

Chapter III : Recursion Chapter III : Recursion


Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Example ❑ Conversion Example
Else {Recursive Call Handling}
CDZ.x ← CDZ.n - 1 We notice that the previous solution pops elements (CDZ) from the
Push(S, CDZ) stack without checking if the stack is empty. Indeed, label RP1 is plugged
CDZ.n ← CDZ.x in after poping all DZs from the stack.
CDZ.adr ← 2 {Return address}
GoTo START {Recursive call}
RP2: f ← CDZ.n *f {Recursive Call Return Point} So we can change the sequence of the return handing code as follows:
a ← CDZ.adr {Retrieve the return address}
Pop(S, CDZ) {Restore the calling subprogram DZ} If isEmpty(S) Then {Return Management}
if a = 1 then {Return handling} GoTo RP1
GoTo RP1 Else
Else Pop(S, CDZ) {Restore the calling subprogram DZ}
GoTo RP2 GoTo RP2
EndIf
EndIf EndIf
RP1: Return f {Return handling : final return point}
End
45 46
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Example ❑ Conversion Example
Function Fact( n : integer) : integer
We also notice that we no longer need to save the return address since Var f : integer; S : stack;
we know where to return to : If the stack is empty, return to (RP1) Begin
else return to (RP2). CreateSrack(S)

Let's try to improve our solution further. If we look more closely at the Start: If (n <= 1) Then {starting point}
initial recursive solution: The variable x is not used after returning from f ← 1
the call to the Factorial function. So why save it? If IsEmpty(S) Then {Return Management}
Hence, we just need to save and retrieve the variable n. Finaly, the use of GoTo RP1
a simple stack of integers is enough. Else
Pop(S, n) {Restore the calling subprogram DZ}
GoTo RP2
Now let's rewrite a simplified version of the iterative algorithm.
EndIf

47
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT 48

Chapter III : Recursion Chapter III : Recursion


Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Example ❑ Conversion Example
Else {Recursive Call Handling}
Push(S, n) We can also see that the return handling sequence is repeated twice
n ← n - 1 when (n <= 1) and (n > 1)
GoTo START {Recursive call}
Function Fact( n : integer) : integer
Var f: integer; S : stack;
RP2: f ← n *f {Recursive Call Return Point} Begin
If IsEmpty(S) Then {Return Handling} CreateSrack(S)
GoTo RP1
Else Start: If (n <= 1) Then {starting point}
Pop(S, n) {Restore the calling subprogram DZ} f ← 1
GoTo RP2 Else {Recursive Call Handling}
EndIf Push(S, n)
EndIf n ← n – 1
RP1: Return f {Return Handling : final return point} GoTo START {Recursive call}
End EndIF

49 50
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Example ❑ Conversion Example
We notice at this level, that this algorithm is made up of 02 loops that revolve
around the 02 labels (START) and (RP2), We can then use a Classic loop
RP2: If IsEmpty(S) Then {Return Handling}
as follows :
GoTo RP1
Else {Iterative version of the factorial
function}
Pop(S, n) {Restore the calling subprogram DZ} FunctionFactorial (n : Integer) : Integer
f ← n *f {Recursive Call Return Point} Var f : Integer; S: Stack
GoTo RP2 Begin
EndIf CreateStack(S) …
f ← 1 While Not isEmpty(S) Do
RP1: Return f {Return management: final return point} While n > 1 Do Pop(S,n)
End Push(S,n) f ← f * n
n ← n -1 EndWhile
EndWhile
… Return f
End
51 52
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT

Chapter III : Recursion Chapter III : Recursion


Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Conversion Example
Finally, we can also notice that in this solution, the 1st loop only push
integers ranging from n to 1, and the 2nd only pop these integers from 1 to
n, as long as the stack is not empty. So, we push values, and when we finish, The GOTO statement is used to jump directly to a specific label
we pop them.The solution can be simplified as follows: in the code. A label is a name followed by a colon (:) that marks a
{Iterative version of the factorial function}
Function Factorial (n : Integer) : Integer location in the code. In assembler, its equivalent would be JMP.
Var f, x: Integer;
Begin
f ← 1
For x From n to 1 by step of -1 Do
f ← f * x
EndFor
Return f
End

53 54
Dr. Lamia CHEKLAT Dr. Lamia CHEKLAT
Chapter III : Recursion Chapter III : Recursion
Converting recursive algorithms to iteratives Converting recursive algorithms to iteratives
❑ Exercice 1: ❑ Exercice 1: Solution
Consider the recursive function PrRec which calculates the sum of the Function PrIT(n: Integer): Integer
Var r : Integer ; S : Stack
squares of the first n numbers. Transform it into an iterative function Begin
(informel version) CreateStack(S)
Function SumSqrRec(n : Integer): Integer x ← n
Start: If ( n = 1) Then
Var r: Integer r ← 1
Begin Else
If ( n = 1 ) Then Push(S, n)
r ← 1 n ← n - 1
Else GoTo START
If (n > 1) Then {to exclude negative n} EndIf
r ← SumSqrRec(n-1) RP2: If IsEmpty(Stack) Then
r ← r + (n*n) Goto RP1
EndIf Else
EndIf Pop(S, n)
Return r r ← (n * n )+ r
End Goto RP2
EndIf
RP1: Return r
Dr. Lamia CHEKLAT
55 End 56

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy