Download presentation
Presentation is loading. Please wait.
Published byMarcia Boone Modified over 9 years ago
1
Week 8 Improving on building blocks Recursive procedures
2
What is recursion? n Recursion is an important mathematical concept. n Recursion in programming is a technique for defining a problem in terms of one or more smaller versions of the same problem. n The solution to the problem is built on the result(s) from the smaller version(s).
3
What is recursion? n Best known example: the factorial n! = n (n-1)! 0! = 1 n That’s all you need to calculate n!
4
Recursive procedures n recursive function function_name(…) result(result) n Let’s use it to calculate n! n Structure plan n = 0 factorial_n = 1 n > 0 factorial_n = n * factorial(n-1) n < 0 Error! Return factorial_n = 0
5
Example ! Factorial,function to calculate factorials recursively !* accepts : integer n => 0 !* returns : n ! function factorial (n) result (n) integer : : fact, i integer, intent (in) : : n fact = 1 do i = 2, n fact = fact * i end do end function factorial
6
Example ! Factorial, function to calculate factorials recursively !* accepts : integer n => 0 !* returns : n ! recursive function factorial (n) result (n) integer : : fact integer, intent (in) : : n if ( n == 0 ) then fact = 1 else fact = n * factorial (n-1) end if end function factorial
7
Solution 1 recursive function factorial(n) result(factorial_n) ! Dummy argument and result variable integer, intent(in) :: n real :: factorial_n ! Determine whether further recursion is required select case(n) case(0) ! Recursion has reached the end factorial_n = 1.0 case(1:) ! More recursive calculation(s) required factorial_n = n*factorial(n-1) case default ! n is negative - return zero as an error indicator factorial_n = 0.0 end function factorial Write a function for n! Using “select case” structure.
8
Solution 2 recursive subroutine factorial(n, factorial_n) ! Dummy arguments integer, intent(in) :: n real, intent(out) :: factorial_n ! Determine whether further recursion is required select case(n) case(0) ! Recursion has reached the end factorial_n = 1.0 case(1:) ! Recursive call(s) required ! to obtain (n-1)! call factorial(n-1, factorial_n) case default ! n is negative - return zero as an error indicator factorial_n = 0.0 end subroutine factorial Write a subroutine for n! Using “select case” structure.
9
Procedures as arguments Up to now, procedures had as dummy arguments real, integer, character, logical and arrays with these types n But, what about a procedure as a dummy argument?
10
How to declare a procedure? n We have to provide information concerning the interface of the procedure The interface block: interface interface_body end interface
11
How to declare a procedure? Example: interface function dummy_fun(a, b) result(r) real, intent(in) :: a, b real :: r end function dummy_fun end interface
12
How to declare a procedure? Example: interface subroutine one_arg(x) real, intent(inout) :: x end subroutine one_arg recursive subroutine two_args(x, y) real, intent(inout) :: x, y end subroutine two_args end interface
13
Couple of details... n Dummy procedure arguments in a function must be functions n All actual procedure arguments must be module procedures n It is not permissible for an intrinsic procedure to be an actual argument
14
Derived data types : Creating your own data n You can create your own data types! n They can be derived from: –Intrinsic data types: integer, real, character, logical –Previously defined data types F provides the programmers to create their own data type to supplement the above-given intrinsic types.
15
Derived data types and structures As mentioned before, arrays are used to store elements of the same type. Sometimes items needed to be processed, are not all of the same type. A data consisting a date for example, has two different types : the month name of character type the day and year of integer type Another example can be given a record (measurement) captured using a computer, might contain an user’s name in character strings a password in character strings an identification number of integer type captured record of real type
16
Derived data types and structures type, public :: new_type component_definition... end type new_type F provides a “derived data type” in order to declare a “structure” used to store items of different types. The position in the structure, in which these data items are stored, are called the “components of the structure”. It is possible to store a name component, a password component, etc. in a structure using the form of,
17
Example type, public :: person character(len=12) :: first_name character(len=1) :: middle_initial character(len=12) :: last_name integer :: age character(len=1) :: sex ! M or F character(len=5) :: tax_number end type person
18
Example Now you can declare variable of type person : type ( type_name ) : : list_of_identifiers type(person) :: ali, mukaddes, veli
19
Be careful... n Declaratins need access to the type definition n Place definitions in a module
20
Putting data in a derived type variable ali = person("Ali","M","Aktepe",56,"M","45645") mukaddes = person("Mukaddes"," ","Has",18,"F","12345") veli = person("Veli","M","Karatepe",65,"M","34567") This is a structure constructor
21
Refering to components n variable%component structure_name % component_name Example: ali%last_name mukaddes%age veli%first_name
22
Using derived types to define new derived types n type, public :: employee type(person) :: employee character(len=20) department real :: salary end type employee n type(person) :: saadet n saadet%employee%age = 34
23
Arrays of derived types type(person), dimension(1:12) :: bil102class Then: bil102class(2)%sex = "M" You can do operations on components : bil102class(3)%age+bil102class(4)%age But no such operation is permissible: bil102class(3) - bil102class(4)
24
Example: Let's do some geometry! n Two derived types: –point –line n Two functions: –distinct_points(p1,p2) result(distinct) –line_from_points(p1,p2) result(join_line)
25
program example_8_1_1 !variable declaration real:: result integer :: n print *,"enter n value" read *, n !result = factorial(n) call factorials(n,result) print *,n,"!=", result end program example_8_1_1 recursive function factorial(n) result(factorial_n) !dummy argument and result variable integer, intent(in) :: n real :: factorial_n !determine whether further recursion is required select case (n) case(0) !recursion has reached the end factorial_n = 1.0 case (1:) !more recursive calculation(s) requires factorial_n = n*factorial(n-1) case default !n is negative - return zero as an error indicator factorial_n = 0.0 end select end function factorial
26
program example_8_1_2 !variable declaration real:: result integer :: n print *,"enter n value" read *, n call factorial(n,result) print *,n,"!=", result end program example_8_1_2 recursive subroutine factorial(n, factorial_n) !dummy argument and result variable integer, intent(in) :: n real, intent(out) :: factorial_n !determine whether further recursion is required select case (n) case(0) !recursion has reached the end factorial_n = 1.0 case (1:) !recursive call(s) required to obtain (n-1)! call factorial(n-1, factorial_n) factorial_n = n*factorial_n case default !n is negative - return zero as an error indicator factorial_n = 0.0 end select end subroutine factorial
27
Write a module that sorts given v vector in an ascending order
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.