改め Objective Technician

はぐれ技術者のやりたい放題

相互再帰

2009-10-23 00:19:37 | プログラミング
二つ以上の関数を相互に再帰呼び出しするという手法



以下は、sin(1°) と cos(1°) の値だけ知ってれば加法定理で sin(整数°) と cos(整数°) が全部求められるというもの。


一年生のときの演習課題に出て、今でもよく思い出す例題。


モカが VisualBasic も楽しいからというので、初めて VB で書いてみた。





	
Public Class Form1

    Private Function RecursiveCos(ByVal angleDegree As Integer) As Double

        If (Math.Abs(angleDegree) = 1) Then
            Return 0.99984769515639127
        ElseIf (angleDegree = 0) Then
            Return 1

        Else
            Dim arg As Double = angleDegree / 2
            Dim a As Integer = Math.Floor(arg)
            Dim b As Integer = Math.Ceiling(arg)

            Return RecursiveCos(a) * RecursiveCos(b) - RecursiveSin(a) * RecursiveSin(b)

        End If
    End Function


    Private Function RecursiveSin(ByVal angleDegree As Integer) As Double

        If (Math.Abs(angleDegree) = 1) Then
            Return 0.017452406437283512 * Math.Sign(angleDegree)
        ElseIf (angleDegree = 0) Then
            Return 0

        Else
            Dim arg As Double = angleDegree / 2
            Dim a As Integer = Math.Floor(arg)
            Dim b As Integer = Math.Ceiling(arg)

            Return RecursiveSin(a) * RecursiveCos(b) + RecursiveCos(a) * RecursiveSin(b)

        End If
    End Function


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim var As Integer
        If (Not Integer.TryParse(TextBox1.Text, var)) Then
            MsgBox("FormatException")
            Return
        End If

        If (RadioButton1.Checked) Then
            Label1.Text = RecursiveSin(var).ToString()
        Else
            Label1.Text = RecursiveCos(var).ToString()
        End If

    End Sub

End Class










加法定理と言えば、うちの高校は男子校だけあって、とんでもなく下品な語呂合(ry










再帰といえば、関数型言語の ML(meta language) を思い出す。


うちの研究所の敷地内にも ML の開発をしているチームがいる。



ML では、リストの生成からループ処理まで、なんでもかんでも再帰で書く(というイメージを持っている)。




再帰の考え方は美しいが、でも、ここまでひたすらに再帰を使いまくる言語を愛してしまう人たちは変態なんじゃないのと思う。






「変態」は称賛の言葉である。

念のため。