fortran66のブログ

fortran について書きます。

昔は再帰の例としてしょっちゅう見かけたもんですが。C-Curve です。

Fortranでは、なんとなく再帰は忌み嫌われていますが、たまにはいいよね。

PROGRAM c_curve
USE plotter
IMPLICIT NONE
INTEGER :: norder
WRITE(*, *) 'input order'
READ(*, *) norder
CALL gr_on('C-curve', 640, 480)
CALL gr_axis(0.0, 4.0, 0.0, 3.0) ! xmin, xmax, ymin, ymax
CALL gr_show()
CALL sleep(50)
CALL move(1.0, 2.0)
CALL c(norder, 2.0, 0.0)
CALL gr_off()
STOP
CONTAINS 
!---------------------------------
RECURSIVE SUBROUTINE c(i, dx, dy)
IMPLICIT NONE
INTEGER, INTENT(IN) :: i
REAL, INTENT(IN) :: dx, dy
IF (i == 0) THEN 
 CALL draw_rel(dx, dy)
ELSE
 CALL c(i - 1, (dx + dy) / 2.0, (dy - dx) / 2.0 )
 CALL c(i - 1, (dx - dy) / 2.0, (dy + dx) / 2.0 )
END IF
RETURN
END SUBROUTINE c
!---------------------------------
END PROGRAM c_curve

うほっプロットは、IEを開いているときに READ * 入力があると、なんかおかしい挙動をする。原因がよく分からない。