PROGRAM LAB_10

 

 

IMPLICIT NONE 

INTEGER :: N, Z

CHARACTER :: Flag

DO

            PRINT *, "Enter a positive integer N"

            READ *, N

            PRINT *, "Sum= ", FUN_SUM(N), " by non-recursive FUNCTION"

            PRINT *, "Sum= ", REC_FUN_SUM(N), " by recursive FUNCTION"

            CALL SUB_SUM(N,Z)

            PRINT *, "Sum= ", Z, " by non-recursive SUBROUTINE"

            CALL REC_SUB_SUM(N,Z)

            PRINT *, "Sum= ", Z, " by recursive SUBROUTINE"

            PRINT *, "Continue? If not, press 'n' or 'N'"

            READ *, Flag

            IF ((Flag=="n") .OR. (Flag=="N")) THEN

                        EXIT

            END IF

END DO

CONTAINS

            FUNCTION FUN_SUM(N)

                        INTEGER, INTENT(IN) :: N

                        INTEGER :: FUN_SUM, I

                        FUN_SUM=0

                        DO I=1, N

                                    IF (MOD(I,3)==0) THEN

                                                FUN_SUM=FUN_SUM+I

                                    END IF

                        END DO

            END FUNCTION FUN_SUM

 

            RECURSIVE FUNCTION REC_FUN_SUM(N) RESULT (MySum)

                        INTEGER, INTENT(IN) :: N

                        INTEGER :: MySum

                        IF (N==3) THEN

                                    MySum=3

                        ELSE

                                    IF (MOD(N,3)==0) THEN

                                                MySum=N+REC_FUN_SUM(N-3)

                                    ELSE

                                                MySum=REC_FUN_SUM(N-1)

                                    END IF

                        END IF

            END FUNCTION REC_FUN_SUM

 

            SUBROUTINE SUB_SUM(N, MySum)

                        INTEGER, INTENT(IN) :: N

                        INTEGER, INTENT(OUT) :: MySum

                        INTEGER :: I

                        MySum=0

                        DO I=1, N

                                    IF (MOD(I,3)==0) THEN

                                                MySum=MySum+I

                                    END IF

                        END DO

            END SUBROUTINE SUB_SUM

 

            RECURSIVE SUBROUTINE REC_SUB_SUM(N, MySum)

                        INTEGER, INTENT(IN) :: N

                        INTEGER, INTENT(OUT) :: MySum

                        IF (N==3) THEN

                                    MySum=3

                        ELSE

                                    IF (MOD(N,3)==0) THEN

                                                CALL REC_SUB_SUM(N-3, MySum)

                                                MySum=N+MySum

                                    ELSE

                                                CALL REC_SUB_SUM(N-1, MySum)

                                    END IF

                        END IF

            END SUBROUTINE REC_SUB_SUM

 

            END PROGRAM LAB_10