[英]How to represent a number with given numbers using arithmetic operations?
這是一個面試問題 。 “給定一組數字和另一個數字,確定是否可以使用標准數學技術操縱數字數組以等於給定的其他數字。例如,給定5和10,你可以使50?5 * 10 = 50,所以是”。 (為簡單起見,我們假設只進行算術運算)。
我建議使用強力搜索(有一些分支和綁定)。 是否有意義 ?
我會問
Numbers
整數嗎? standard mathematical techniques
是什么意思?
等等
Haskell編程,第11章:倒計時問題
我認為這是有道理的。
您可以利用乘法之間的對稱性來進一步修剪樹。 a * b = b * a。
解決這個問題的另一種方法是使用遺傳算法 。 您的人口將從在數組元素之間插入隨機運算符開始。
設S
是你需要的數字。 您的健身功能可以是|S - Value(E[i])|
,其中Value(E[i])
是評估人口中第i
個表達式后的值。
您的變異操作符可以簡單地將一個操作符更改為另一個操作符,並且您的交叉函數可以將表達式左側的運算符與另一個表達式右側的運算符組合在一起。
也許你可以找到更復雜的功能,遺傳算法需要一些猜測才能獲得最佳效果。
我不知道這與蠻力相比如何,但這是一個不同的解決方案,我認為它會讓你在采訪中脫穎而出,因為每個人都能看到蠻力解決方案。
如果你只需要一個足夠好的解決方案(不完全是S
,但足夠接近),那么這絕對應該比蠻力更快。 在我實施的少數遺傳算法中,我注意到他們很快就接近了一個接近最優的解決方案,但速度相當慢,有時甚至會因為你想要最優解決方案而陷入困境。
一個非常重要的第一個問題是:是否允許任何一元操作? 也就是說,我可以將x更改為-x,1 / x,x!或sqrt(x)“免費”嗎?
如果是這樣,天真的分支搜索將不會終止,因為對一元操作的使用次數沒有先驗限制。 如果沒有,天真的搜索可能會正常工作。
這是一個有趣的策略,如果不是一個有效的策略:為正在使用的算術請求或產生BNF語法。 像規則一樣破解
<unit> :: = 5 | 10
然后使用該語法開發使用少於20個語法規則獲得的所有可能的表達式。 全部評估它們。 這將保證有限,並將生成在語言中有效的所有“不太復雜”的表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.