这是interview question。 “给定一组数字和另一个数字,确定是否可以使用标准数学技术操纵数字数组以等于给定的其他数字。例如,给定5和10,你可以使50?5 * 10 = 50,所以是”。 (为简单起见,我们假设只进行算术运算。)
我建议使用强力搜索(带有一些分支和绑定)。它有意义吗?
答案 0 :(得分:4)
蛮力听起来像是解决这个问题的有效方法。但是蛮力是不知情的搜索......当你到达搜索树中的一个分支时,它没有做出有根据的猜测。
您可能希望了解的是heuristic functions是否可以帮助您进行搜索通知。启发式函数查看状态并估计您离目标有多远。如果您可以找到有效的启发式函数,则可以应用A*等算法。
警告:这似乎不是一个容易定义启发式的问题。
答案 1 :(得分:1)
我会问
Numbers
整数吗?standard mathematical techniques
是什么意思?
等
答案 2 :(得分:1)
Haskell编程,第11章:倒计时问题
答案 3 :(得分:0)
我认为这是有道理的。
您可以利用乘法之间的对称性来进一步修剪树。 a * b = b * a。
答案 4 :(得分:0)
另一种解决方法是使用genetic algorithms。您的人口将从在数组元素之间插入随机运算符开始。
让S
成为您需要的号码。您的适应度函数可以是|S - Value(E[i])|
,其中Value(E[i])
是评估人口中i
表达式后的值。
您的变异操作符可以简单地将一个操作符更改为另一个操作符,并且您的交叉函数可以将表达式左侧的运算符与另一个表达式右侧的运算符组合在一起。
也许你可以找到更复杂的功能,遗传算法需要一些猜测才能获得最佳效果。
我不知道这与蛮力相比如何,但这是一个不同的解决方案,我认为这会让你在采访中脱颖而出,因为每个人都能看到蛮力解决方案。
如果你只需要一个足够好的解决方案(不完全S
,但足够接近),那么这绝对应该比蛮力更快。在我实施的少数几种遗传算法中,我注意到它们很快就接近了一个接近最优的解决方案,但速度很慢,有时甚至会因为你想要最优解而陷入困境。
答案 5 :(得分:0)
一个非常重要的第一个问题是:是否允许任何一元手术?也就是说,我可以将x更改为-x,1 / x,x!或sqrt(x)“免费”吗?
如果是这样,天真的分支搜索将不会终止,因为对一元操作的使用次数没有先验限制。如果没有,天真的搜索可能会正常工作。
这是一个有趣的策略,如果不是一个有效的策略:为正在使用的算术请求或产生BNF语法。像
这样的规则<单位> :: = 5 | 10
然后使用该语法开发使用少于20个语法规则获得的所有可能表达式。全部评估它们。这将保证有限,并将生成所有语言中有效的“不太复杂”的表达。