鍍金池/ 問答/C++  HTML/ JavaScript遞歸生成排列組合[已解決]

JavaScript遞歸生成排列組合[已解決]

背景
我是做美團(tuán)外賣的
經(jīng)常會(huì)回復(fù)顧客的評(píng)價(jià)
每次都要手工打一次,太麻煩了
就想自動(dòng)生成一些簡單的評(píng)價(jià),直接復(fù)制就可以了
結(jié)果真心是邏輯思維能力太差..怎么也過不了遞歸這一關(guān).....試了快2個(gè)小時(shí),還是解決不了

數(shù)組

var wordList = [
    ['熱烈', '萬分', '非常', ''],
    ['歡迎', '感謝', '謝謝'],
    ['您', '親', '老板', '大神', ''],
    ['光臨', '惠顧', '支持'],
    ['小店', '本店', '火女菜館']
];

問題
怎么自動(dòng)排列組合出來
熱烈歡迎您光臨小店,熱烈歡迎您光臨本店....非常謝謝大神支持火女菜館

麻煩大家?guī)兔纯催@個(gè)題怎么解
然后指出一下我究竟是哪里的問題?為什么就是想不出來怎么解這個(gè)題目,要通過哪些練習(xí)才可以自己處理這種問題呢?
這感覺就像是初中做數(shù)學(xué)題一樣,就是不知道怎么辦...

我的解法
雖然是解出來了,但完全是靠猜的.沒有思路,要是再遇到類似的遞歸問題,肯定還是沒有思路.
并且這個(gè)寫法肯定不是最優(yōu)解....還是上面的問題.請(qǐng)大家指教一下

function combine(i, results, res) {
    for (var j = 0; j < wordList[i].length; j++) {
        var temp = res;
        res += wordList[i][j];
        if (wordList[i + 1]) combine(i + 1, results, res);
        else {
            results.push(res);
        }
        res = temp;
    }
}
var results = [];
combine(0, results, '');
console.log(results);
看樣子只適合做業(yè)務(wù)層面的淺編程啦...稍微要涉及到算法的東西都理解的很困難,一樓的那個(gè)效率要高好多
回答
編輯回答
離魂曲

你是想生成一個(gè)全排列的結(jié)果吧
你這個(gè)一共有
3x3x4x3x3 種可能的
而且這個(gè)不應(yīng)該用遞歸吧,直接就可以5層循環(huán)全遍歷啊,為什么要遞歸?
還有一種辦法,遞歸都不需要,用位運(yùn)算就可以提取出來,根據(jù)你的情況,就是一個(gè)10位二進(jìn)制數(shù),每2位代表一個(gè)就可以提取出來了,不過要注意做過濾。
我實(shí)現(xiàn)一下后面一種情況。

var wordList = [
    ['熱烈', '萬分', '非常', ''],
    ['歡迎', '感謝', '謝謝'],
    ['您', '親', '老板', '大神', ''],
    ['光臨', '惠顧', '支持'],
    ['小店', '本店', '火女菜館']
];
for(let i=0;i<1024;i++){
    //把i按2bit分成5份
    b2t0=i&3
    b2t1=(i>>2)&3
    b2t2=(i>>4)&3
    b2t3=(i>>6)&3
    b2t4=(i>>8)&3
    if( (b2t0==3)|| (b2t1==3) ||(b2t3==3) ||(b2t4==3)) continue
    console.log(wordList[0][b2t0]+wordList[1][b2t1]+wordList[2][b2t2]+wordList[3][b2t3]+wordList[4][b2t4])
}
2017年10月3日 20:54