0

与えられた正三角形の面積を求めようとしています。最初に、長さ "l" の大きな正三角形があり、そのすべての辺から長さ "l/3" の新しい正三角形が形成され、3 つの三角形すべての自由辺 (つまり、2 辺のみ) から再び長さ "l" の新しい三角形が形成されます。 /9」。

したがって、再帰を使用して繰り返しと長さが指定されていない場合、すべての三角形の総面積を見つける必要があります

だからここに私が試したコードがあります。2回までの繰り返しでは正しい結果が得られ、それ以上では間違った結果が得られます。

Module Module1
    Dim noOfTriangles As Single = 3 / 2

    Function AreaOfTriangle(ByVal noOfRepetition As Integer, ByVal length As Double)
        If noOfRepetition = 0 Then
            Return Nothing
        Else
            noOfTriangles = noOfTriangles * 2
            Return (((3 ^ (1 / 2)) / 4) * (length ^ 2) + noOfTriangles * AreaOfTriangle(noOfRepetition - 1, length / 3))
        End If

    End Function

    Sub Main()
        Dim area As Double
        area = AreaOfTriangle(3, 9)
        Console.WriteLine(area)
        Console.ReadKey()
    End Sub 
End Module
4

2 に答える 2

3

問題の正確な説明はわかりませんが、修正が必要なコードがいくつかあります。

  • 最初のビジネスOption Strict、プロジェクト オプションで有効にします。いつも。バグが含まれているため、コードはコンパイルされなくなります。

  • 関数の戻り値の型がありません。おそらく (!)SingleまたはDouble.

  • Return Nothing意味がありません。地域は決して「無」ではありません。ただし、可能性があります0

  • モジュール全体の変数を使用しないでください。代わりに別のパラメーターを使用してください。

  • 宣言するとすぐに変数を初期化しますDim area As Double = AreaOfTriangle(…)

  • ロジックをより明確にします。コードが何をするのか本当にわかりません。これには、適切な名前の使用が含まれます。noOfTrianglesは型Singleで、初期値は3 / 2です。これは確かに意味がありません: 三角形の数は常に整数であり、決して分数ではありません。

于 2012-09-09T16:29:29.680 に答える
0

noOfTriangles を掛ける必要はありません。そうしないと、二重にカウントされます。再帰の 1 つのレベルでの三角形の数に面積を掛けています。しかし、あなたの面積自体は再帰であるため、再帰の底までのすべての三角形の面積を計算しています。つまり、3 回目の反復では、「6 つの三角形」ではなく、「2 つの三角形」だけが存在し、実際には、1 回目の反復を除いて、すべての反復で「2 つの三角形」だけが存在します。AreaOfTriangle への呼び出しの外側の乗算によってハンドルに 6、12、24 などが視覚的に存在するという事実。

この行を置き換えます

noOfTriangles = noOfTriangles * 2

これとともに:

If (noOfTriangles = 3 / 2) Then
    noOfTriangles = 3
Else
    noOfTriangles = 2
End If

そして、それはうまくいくはずです。

于 2012-09-09T16:54:04.713 に答える