我正在尝试解决各种递归难题,我遇到的一个问题是方程生成器。我无法理解如何解决这个问题。问题陈述是这样的。
您将获得一个4位数字。例如,1234。现在,你必须这样做 通过放置算术运算符和a来计算方程式 等号在数字之间签名而不改变数字的顺序。
- 1 = 2 + 3-4
- 1-2 = 3-4
- 12 = 3 * 4
- 12/3 = 4
- 1 ^ 2 + 3 = 4
醇>
我想编写一个函数来生成它可以找到的第一个方程,并以C#或Java形式返回它。任何人都可以提供线索或指针,如何递归地解决这个问题?
答案 0 :(得分:4)
任何人都可以提供线索或指针来解决这个问题吗?
是。除了所有其他好的建议:阅读Pólya的“如何解决它”。这本书是关于如何解决数学问题的,但其中的许多建议都适用于编程问题。
http://en.wikipedia.org/wiki/How_to_Solve_It
Pólya最能适用于您的问题的建议是解决更简单的问题。例如,你能解决这个问题吗?
您将获得一个4位数字。例如,1234。现在,你必须通过在数字之间放置一个等号而不改变数字的顺序来制作一个等式。例如:
1=234
12=34
123=4
当然所有这些方程都是 false ,但很明显,如果你不能解决生成没有算子的假方程的问题那么你就无法解决用算子生成真正方程的难题。解决更简单的问题,这将为您提供如何解决更大问题的见解。
答案 1 :(得分:2)
将任务拆分为三个不同的子任务:
=
视为运算符)有关生成组合的信息,请参阅this。 最后,在您还有评估功能后......
var results = GetCombinations().Where(comb => Evaluate(nums, comb)).ToList();
请注意,为了避免吃汤,我故意简短。
答案 2 :(得分:1)
提示:你可以:
生成字符串然后尝试解析并将它们评估为方程式,以查看它们在语法上是否有效且“是”,或
生成并评估等式树,对它们进行评估,然后将它们解析为字符串,如果它们是“真实的”。
这两种方法都有挑战......但发现和解决它们是你的工作: - )
答案 3 :(得分:1)
我的老数学老师过去常常每天都玩这个游戏。有趣的。
无论如何,关键是按顺序逐步完成每个可能的等式。 (我知道这是一个递归问题,但是听我说)
这样的事情:
递归函数(序列):
如果有效序列返回
foreach operator position
foreach operator
recursivefunction(sequence with new operator)
答案 4 :(得分:1)
为您提供一些提示: