成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

遞歸方式窮舉Google方程式(javascript實(shí)現(xiàn))

tianlai / 1548人閱讀

摘要:搜索函數(shù)第一層調(diào)用,設(shè)置第一個(gè)字符后遞歸調(diào)用,字符規(guī)模減少了首字符邊界條件是所有的字符都設(shè)置完成,即調(diào)用回調(diào)函數(shù),檢測(cè)等式是否成立,并輸出等式成立的方案。

此為《算法的樂(lè)趣》讀書(shū)筆記,我用javascript重新實(shí)現(xiàn)算法。這個(gè)實(shí)現(xiàn)方案還很通用,應(yīng)用了策略模式,把具體的方程計(jì)算隔離包裝到了回調(diào)函數(shù)中。

Google方程式

題目:有一個(gè)由字符組成的等式:WWWDOT - GOOGLE = DOTCOM,每個(gè)字符代表一個(gè)0~9之間的數(shù)字,請(qǐng)找出一組字符和數(shù)字的對(duì)應(yīng)關(guān)系,使等式成立。

定義數(shù)據(jù)結(jié)構(gòu)

定義charItem數(shù)組保存問(wèn)題中所有出現(xiàn)的字母,leading屬性表示該字母會(huì)出現(xiàn)在首位;定義tagCharValue數(shù)組保存數(shù)字,used屬性表示該字母的使用狀態(tài),因?yàn)椴煌淖帜冈谕粫r(shí)間不能相等。

var charItem = [
    { c:"W", value:-1, leading:true},
    { c:"D", value:-1, leading:true},
    { c:"O", value:-1, leading:false},
    { c:"T", value:-1, leading:false},
    { c:"G", value:-1, leading:true},
    { c:"L", value:-1, leading:false},
    { c:"E", value:-1, leading:false},
    { c:"C", value:-1, leading:false},
    { c:"M", value:-1, leading:false}
];
var tagCharValue = [
    { used:false, value:0 },
    { used:false, value:1 },
    { used:false, value:2 },
    { used:false, value:3 },
    { used:false, value:4 },
    { used:false, value:5 },
    { used:false, value:6 },
    { used:false, value:7 },
    { used:false, value:8 },
    { used:false, value:9 }
];
回調(diào)函數(shù)(具體計(jì)算規(guī)則)

把具體計(jì)算規(guī)則提取出來(lái),放到回調(diào)函數(shù)中,使用算法具有能用性。

searchingResult(charItem,tagCharValue,0,function(ci){
    var minuend = "WWWDOT";
    var subtrahend = "GOOGLE";
    var diff = "DOTCOM";

    var m = MakeIntegerValue(ci, minuend);
    var s = MakeIntegerValue(ci, subtrahend);
    var d = MakeIntegerValue(ci, diff);

    if(m - s == d){
        console.log(m + " - " + s + " = " + d);
    }
})
字符串到整數(shù)的轉(zhuǎn)換

把字符替換成相應(yīng)的數(shù)字。

function MakeIntegerValue(ci, str){
    var rs = str.split("");
    var outcome = 0;
    rs.forEach(function(al){
        for(var i=0; i
有效性檢測(cè)

基于數(shù)字的位置及其使用情況,進(jìn)行有效性檢測(cè)。零不能在首位,不同字符不能相等。

function isValueValid(item, value){
    if(item.leading){
        return !value.used && value.value;
    }else{
        return !value.used;
    }
}
搜索函數(shù)

第一層調(diào)用,設(shè)置第一個(gè)字符后遞歸調(diào)用,字符規(guī)模減少了首字符;邊界條件是所有的字符都設(shè)置完成,即調(diào)用回調(diào)函數(shù),檢測(cè)等式是否成立,并輸出等式成立的方案。

function searchingResult(ci, cv, index, callback){
    if(index == charItem.length){
        callback(ci);
        return;
    }
    for(var i=0; i
輸出結(jié)果

本題有兩個(gè)解。

777589 - 188103 = 589486
777589 - 188106 = 589483
比較非遞歸方案

我的第一反應(yīng),非遞歸方案應(yīng)該效率要高,為了驗(yàn)證,我寫(xiě)如下的非遞歸實(shí)現(xiàn)。運(yùn)行的結(jié)果超出我的預(yù)期,非遞歸方案比遞歸方案慢了不止一個(gè)數(shù)量級(jí)。
分析原因,非遞歸對(duì)不同字符不能取相同的數(shù)字的判斷不好實(shí)現(xiàn),且不能避免(也有可能是我的判重算法效率太低);而遞歸方案卻很自然的避免了這個(gè)問(wèn)題。

for(var w = 1; w <= 9; w++)
for(var d = 1; d <= 9; d++)
for(var o = 0; o <= 9; o++)
for(var t = 0; t <= 9; t++)
for(var g = 1; g <= 9; g++)
for(var l = 0; l <= 9; l++)
for(var e = 0; e <= 9; e++)
for(var c = 0; c <= 9; c++)
for(var m = 0; m <= 9; m++){
    var tmp = {};
    tmp[w]=1;
    tmp[d]=1;
    tmp[o]=1;
    tmp[t]=1;
    tmp[g]=1;
    tmp[l]=1;
    tmp[e]=1;
    tmp[c]=1;
    tmp[m]=1;
    if(Object.keys(tmp).length == 9){
        if(w*100000+w*10000+w*1000+d*100+o*10+t - g*100000-o*10000-o*1000-g*100-l*10-e == d*100000+o*10000+t*1000+c*100+o*10+m)
            console.log(w.toString()+w.toString()+w.toString()+d.toString()+o.toString()+t.toString()+"-"+ 
                        g.toString()+o.toString()+o.toString()+g.toString()+l.toString()+e.toString()+"="+ 
                        d.toString()+o.toString()+t.toString()+c.toString()+o.toString()+m.toString());
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79124.html

相關(guān)文章

  • 大廠算法面試之leetcode精講3.動(dòng)態(tài)規(guī)劃

    摘要:動(dòng)態(tài)規(guī)劃問(wèn)題一定會(huì)具備最優(yōu)子結(jié)構(gòu),才能通過(guò)子問(wèn)題的最值得到原問(wèn)題的最值。另外,雖然動(dòng)態(tài)規(guī)劃的核心思想就是窮舉求最值,但是問(wèn)題可以千變?nèi)f化,窮舉所有可行解其實(shí)并不是一件容易的事,只有列出正確的狀態(tài)轉(zhuǎn)移方程才能正確地窮舉。 大廠算法面試之leetcode精講3.動(dòng)態(tài)規(guī)劃視頻教程(高效學(xué)習(xí)):點(diǎn)擊學(xué)習(xí)目錄:1.開(kāi)篇介...

    番茄西紅柿 評(píng)論0 收藏2637
  • n階貝塞爾曲線(bezier)javascript 實(shí)現(xiàn)解析

    摘要:最近學(xué)習(xí),看到曲線,所以補(bǔ)充了下知識(shí),另外相關(guān)的數(shù)學(xué)定律都忘光了需要了解的前期需要了解相關(guān)的知識(shí),可以看下維基百科什么是貝塞爾曲線什么是線性插值繪制本身只提供了二次和三次的繪制函數(shù),如果更高階級(jí)的怎么辦呢要對(duì)起進(jìn)行降階拆分。 最近學(xué)習(xí)canvas,看到bezier曲線,所以補(bǔ)充了下知識(shí),另外相關(guān)的數(shù)學(xué)定律都忘光了~ 需要了解的 前期需要了解相關(guān)的知識(shí),可以看下維基百科 什么是貝塞爾曲...

    Labradors 評(píng)論0 收藏0
  • n階貝塞爾曲線(bezier)javascript 實(shí)現(xiàn)解析

    摘要:最近學(xué)習(xí),看到曲線,所以補(bǔ)充了下知識(shí),另外相關(guān)的數(shù)學(xué)定律都忘光了需要了解的前期需要了解相關(guān)的知識(shí),可以看下維基百科什么是貝塞爾曲線什么是線性插值繪制本身只提供了二次和三次的繪制函數(shù),如果更高階級(jí)的怎么辦呢要對(duì)起進(jìn)行降階拆分。 最近學(xué)習(xí)canvas,看到bezier曲線,所以補(bǔ)充了下知識(shí),另外相關(guān)的數(shù)學(xué)定律都忘光了~ 需要了解的 前期需要了解相關(guān)的知識(shí),可以看下維基百科 什么是貝塞爾曲...

    EastWoodYang 評(píng)論0 收藏0
  • 神經(jīng)網(wǎng)絡(luò)中的梯度下降與反向傳播的關(guān)系(大白話,通俗易懂版本)

    摘要:損失函數(shù)的作用可以理解為當(dāng)前向傳播得到的預(yù)測(cè)值與真實(shí)值接近時(shí),取較小值。 神經(jīng)網(wǎng)絡(luò) 神經(jīng)網(wǎng)絡(luò)就是一個(gè)萬(wàn)能的模型+誤差修正函數(shù),每次根據(jù)訓(xùn)練得到的結(jié)果與預(yù)想結(jié)果進(jìn)行誤差分析,進(jìn)而修改權(quán)值和閾值,一步一步得到能輸出和預(yù)想結(jié)果一致的模型。 舉一個(gè)例子:比如某廠商生產(chǎn)一種產(chǎn)品,投放到市場(chǎng)之后得到了消費(fèi)者的反饋,根據(jù)消費(fèi)者的反饋,廠商對(duì)產(chǎn)品進(jìn)一步升級(jí),優(yōu)化,從而生產(chǎn)出讓消費(fèi)者更滿意的產(chǎn)品。這就是...

    鄒立鵬 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<