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つの演算結果の配列を考慮すると,コードは明らかに「複雑」である.(実際、ここの複雑さは、書くのが複雑なだけか、コードの行数が多いだけで、実際には理解が非常に簡単です.)
まず、思考算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