24ポイント再帰アルゴリズム

5103 ワード

Excelhome香川群子作品
まず、思考算24の本質は、4つの数(一般的には1-10)【例えば4つの数をとる:a 1、a 2、a 3、a 4】
各2つの数値の加算、減算、乗算、除算の4つのアルゴリズムのうちの1つにより、1つの【2要素計算結果】【例えばa 1とa 2を加算:計算結果=a 1+a 2】を得る
次に、この【2要素計算結果】を加算、減算、乗算、除算の4つのアルゴリズムのうちの1つと、残りの2つの数のうちの1つ、または残りの2つの数の別の計算結果で引き続き計算し、【3要素計算結果】【例えば、計算結果(a 1+a 2)に対して乗算する:(a 1+a 2)a 3、または(a 1+a 2)a 4】または、直接a 3、a 4も同様に1回計算し、減算で結果を得た場合【(a 3-a 4)】
最後に、この【3要素計算結果】を4つのアルゴリズムのうちの1つを加算、減算、乗算、除算し、残りの最後の数で計算を続けると、最後に4要素計算結果が得られる【例:(a 1+a 2)a 3-a 4、または(a 1+a 2)a 3/a 4等】または、第1回目の計算結果(a 1+a 2)と第2回目の計算結果(a 3-a 4)の計算結果も含む【例えば(a 1+a 2)*(a 3-a 4)】
このように、一般的には、4つの要素が3回の計算過程を通じて、【加算、減算、乗算、除算の4つのアルゴリズムのみを用いた】計算結果を得ることができる.次のようになります.
この最終計算結果がちょうど=24であれば,計算は解を見つけた.
実際の人間の脳計算では、経験によって計算ができないことが多い.
なぜなら、4つの数の並び順には432*1=24種類があり、プラス、マイナス、乗算、除算の並びを加えると、さらに多くなるからです.
等価計算結果を除いて、実際には2250種類の異なる計算方法があります.(4つの数の中に重複があると計算結果は減少するが、4つの数がすべて同じであっても、少なくとも100種類以上の計算方法があり、約40種類の異なる計算結果が得られる.)
したがって,VBAを用いて計算することは,すべての適合条件解を探索することを保証する必然となる.
次に、再帰的な考え方を使用します.
再帰的な要件:
  • 計算のたびに複雑度が低下します.
  • 計算プロセスは反復可能である.すなわち,代入パラメータは異なるが,パラメータタイプと計算方法,および判断基準は一致する.

  • 用語で言えば、同じ入口、出口、および処理条件を有する.
    私は順方向処理プロセスを採用して処理しました.
    しかし、再帰を考えるときの考え方は、逆です.
    次は本題に入ります.
    まず、計算の最終結果の出口を考えます.それは、計算結果=24です.
    入り口は?前に分析したように、3ステップ目の計算プロセス、すなわち2つの計算結果パラメータであるべきです.
    処理過程も簡単で、「プラス、マイナス、乗算、除算」です.
    したがって、書き出しコードは次のようになります.
    Sub calc2(c(), t1, t2) …… End Sub
    再帰サブプロシージャは、最後の2つの要素の計算である「calc 2」と命名されます.パラメータ1は配列c()の2つの計算対象要素で十分です.......その後,中間計算結果の文字列を出力する必要があることが分かったので,t 1,t 2の2つのエントリパラメータが追加された.(実際には配列格納で解決できるが,コードの可読性を考慮して後で変更しなかった.
    次に、加算の処理手順を例示する.
    s=c(1)+c(2)′はc(1)とc(2)の最後の2要素の加算結果を計算し,If Round(s,12)=t Then'計算結果=t(すなわち最終目標値を計算すると、24を計算すると当然コード開始時にtを=24に付与する)k=k+1'結果配列番号+1 d(k)=「=」&t 1&「+」&t 2'計算結果e(k)=「=」&t 1&「+」&t 2'結果配列eに計算結果を書き込む文字式(実は両者の内容はほぼ同じで、スペースが1つしかありません)End If
    はい、処理過程は簡単です.
    結果を配列のコード部分に出力する場合は、コードを1行に省略できます.
    すなわちif【最終計算結果】=【目標値】then【結果を配列に出力し、終了】
    しかし,加算,減算,乗算,除算の4つの演算結果の配列を考慮すると,コードは明らかに「複雑」である.(実際、ここの複雑さは、書くのが複雑なだけか、コードの行数が多いだけで、実際には理解が非常に簡単です.)
    Public drr(3 To 665536, 1 To 2), m, cnt, b
    Sub test2()
        n = [a1].End(4).Row
        ReDim arr(1 To n, 1 To 2)
        For i = 1 To n
            arr(i, 1) = Cells(i, 1)
            arr(i, 2) = Cells(i, 1)
        Next
        b = [d1]
        [f1] = 0
        
        m = 2
        cnt = 0
        zhjs arr, n
        
        [e1] = cnt
        [d3:e65536] = ""
        [d3].Resize(m, 2) = drr
        Erase drr
        
    End Sub
    
    Sub zhjs(arr(), n)
        ReDim brr(1 To n - 1, 1 To 2)
        For i = 1 To n - 1
            For j = i + 1 To n
                If n > 2 Then
                    l = 0
                    For k = 1 To n
                        If k <> i And k <> j Then
                            l = l + 1
                            brr(l, 1) = arr(k, 1)
                            brr(l, 2) = arr(k, 2)
                        End If
                    Next
                End If
                
                For f = 1 To 5
                
                    If f = 4 And arr(i, 1) = 0 Then
                        [f1] = [f1] + 1
    '                    MsgBox arr(i, 2)
    '                    [a1].End(4) = [a1].End(4) + 1
    '                    End
                    ElseIf f = 5 And arr(j, 1) = 0 Then
                        [f1] = [f1] + 1
    '                    MsgBox arr(j, 2)
    '                    [a1].End(4) = [a1].End(4) + 1
    '                    End
                    Else
                        brr(n - 1, 1) = js(arr(i, 1), arr(j, 1), f)
                        brr(n - 1, 2) = jg(arr(i, 2), arr(j, 2), f)
                        If n = 2 Then
                            cnt = cnt + 1
                            If Round(brr(n - 1, 1), 12) = b Then
                                m = m + 1
                                drr(m, 1) = brr(n - 1, 1)
                                drr(m, 2) = brr(n - 1, 2)
                            End If
                        Else
                            zhjs brr, n - 1
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    
    Function js(n1, n2, f)
        Select Case f
            Case 1
                js = n1 + n2
            Case 2
                If n1 > n2 Then js = n1 - n2 Else js = n2 - n1
            Case 3
                js = n1 * n2
            Case 4
                If n1 = 0 Then js = "!0" Else js = n2 / n1
            Case 5
                If n2 = 0 Then js = "!0" Else js = n1 / n2
        End Select
    End Function
    
    Function jg(n1, n2, f)
        Select Case f
            Case 1
                jg = "(" & n1 & "+" & n2 & ")"
            Case 2
                jg = "(" & n2 & "-" & n1 & ")"
            Case 3
                jg = "(" & n1 & "*" & n2 & ")"
            Case 4
                If n1 = 0 Then jg = "/Zero" Else jg = "(" & n2 & "/" & n1 & ")"
            Case 5
                If n2 = 0 Then jg = "/Zero" Else jg = "(" & n1 & "/" & n2 & ")"
        End Select
    End Function