Board logo

標題: 六合彩全餐 for loop 問題 [打印本頁]

作者: Mr.K    時間: 2019-4-16 02:25     標題: 六合彩全餐 for loop 問題

整左好似,可能我轉左牛角尖
明明好似好簡單,唔知做咩愈寫愈多野
請教下,我轉錯左咩方向
  1. calc ();
  2. var box = [];
  3. var count = 0;
  4. function calc (){
  5.     for (var t = 0; t <= 49; t ++){
  6.         for (var i = 1; i <= 49; i ++){
  7.             calcitam (i, t);
  8.         }
  9.     }
  10.     console.log (count);
  11. }
  12. function calcitam (num, level){
  13.     for (var tn = 0; tn < 6; tn ++){
  14.         for (var t = 0; t <= 49; t ++){
  15.             var d = (tn == 0) ? num + t : num + level;
  16.             for (var i = d; i <= 44; i ++){
  17.                 var tmps = [];
  18.                 tmps.push (i);
  19.                 var d2 = (tn == 1) ? d + 1 + t : d + 1 + level;
  20.                 if (d2 <= 49){
  21.                     for (var i2 = d2; i2 <= d2; i2 ++){
  22.                         var tmps2 = tmps;
  23.                         tmps2.push (i2);
  24.                         var d3 = (tn == 2) ? d2+ 1 + t : d2 + 1 + level;
  25.                         if (d3 <= 49){
  26.                             for (var i3 = d3; i3 <= d3; i3 ++){
  27.                                 var tmps3= tmps2;
  28.                                 tmps3.push (i3);
  29.                                 var d4 = (tn == 3) ? d3 + 1 + t : d3 + 1 + level;
  30.                                 if (d4 <= 49){
  31.                                     for (var i4 = d4; i4 <= d4; i4 ++){
  32.                                         var tmps4 = tmps3;
  33.                                         tmps4.push (i4);
  34.                                         var d5 = (tn == 4) ? d4 + 1 + t : d4 + 1 + level;
  35.                                         if (d5 <= 49){
  36.                                             for (var i5 = d5; i5 <= d5; i5 ++){
  37.                                                 var tmps5 = tmps4;
  38.                                                 tmps5.push (i5);
  39.                                                 var d6 = (tn == 5) ? d5 + 1 + t : d5 + 1 + level;
  40.                                                 if (d6 <= 49){
  41.                                                     for (var i6 = d6; i6 <= d6; i6 ++){
  42.                                                         var tmps6 = tmps5;
  43.                                                         tmps6.push (i6);
  44.                                                         if (i6 <= 49){
  45.                                                             var result = tmps6.filter(function(element, index, arr){
  46.                                                                 return arr.indexOf(element) === index;
  47.                                                             })
  48.                                                             if (result.length == 6){
  49.                                                                 if (box.indexOf (tmps6.sort((a,b) => a - b).join(",")) == -1){
  50.                                                                     box.push (tmps6.sort((a,b) => a - b).join(","));
  51.                                                                     //console.log (tmps6);
  52.                                                                     count ++;
  53.                                                                 }
  54.                                                             }
  55.                                                         }
  56.                                                         tmps6.pop ();
  57.                                                     }
  58.                                                 }
  59.                                                 tmps5.pop ();
  60.                                             }
  61.                                         }
  62.                                         tmps4.pop ();
  63.                                     }
  64.                                 }
  65.                                 tmps3.pop ();
  66.                             }
  67.                         }
  68.                         tmps2.pop ();
  69.                     }
  70.                 }
  71.                 tmps.pop ();
  72.             }
  73.         }
  74.     }
  75. }
複製代碼

作者: freefdhk    時間: 2019-4-16 02:55

其實拆多個 function 去再CALL
就可以精簡好多 6倍.

calcitam  CALL  calcitam_SUB   6次
作者: seasky    時間: 2019-4-16 09:04

提示: 作者被禁止或刪除 內容自動屏蔽
作者: hk8guy    時間: 2019-4-16 09:41

點解唔直接用6個for loop? (10行內寫完)
又或者用recursive function
作者: silvester    時間: 2019-4-16 10:38

一個combination 問題, 你用recursion 做會簡單d
search 下combination 和recursion, stackoverflow 上有好多example
作者: Mr.K    時間: 2019-4-16 11:20

其實拆多個 function 去再CALL
就可以精簡好多 6倍.

calcitam  CALL  calcitam_SUB   6次 ...
freefdhk 發表於 2019-4-16 02:55


一開始諗住應該好簡單,loop六次姐,點知寫下寫下就咁多
作者: Mr.K    時間: 2019-4-16 11:21

有無防 123, 132 呢啲組合?
seasky 發表於 2019-4-16 09:04



    係後尾到 sort反左做哂
作者: Mr.K    時間: 2019-4-16 11:22

點解唔直接用6個for loop? (10行內寫完)
又或者用recursive function
hk8guy 發表於 2019-4-16 09:41


原本諗住 loop 6 次應該好簡單,唔知係未諗錯一步仲係到睇緊邊到錯左
作者: Mr.K    時間: 2019-4-16 11:23

一個combination 問題, 你用recursion 做會簡單d
search 下combination 和recursion, stackoverflow 上有好 ...
silvester 發表於 2019-4-16 10:38



    呢d方法我識,但係諗住好簡單又用一次冇做到,可能要重寫
作者: hk8guy    時間: 2019-4-16 12:01

原本諗住 loop 6 次應該好簡單,唔知係未諗錯一步仲係到睇緊邊到錯左
Mr.K 發表於 2019-4-16 11:22


用level呢個方法有D怪, 所以會有太多if, 同埋中間for loop(i2, i3...)都係loop 一次
作者: hk8guy    時間: 2019-4-16 12:09

就咁應該得
  1. for (i1 = 1; i1 <= 44; i1++) {
  2.         for (i2 = i1 + 1; i2 <= 45; i2++) {
  3.                 for (i3 = i2 + 1; i3 <= 46; i3++) {
  4.                         for (i4 = i3 + 1; i4 <= 47; i4++) {
  5.                                 for (i5 = i4 + 1; i5 <= 48; i5++) {
  6.                                         for (i6 = i5 + 1; i6 <= 49; i6++) {
  7.                                                 ...;}
  8.                                 }
  9.                         }
  10.                 }
  11.         }
  12. }
複製代碼

作者: 天下無雙    時間: 2019-4-16 19:59

就咁應該得
hk8guy 發表於 16-4-2019 12:09


就題目而言,呢個係蠢既方法
快既方法去搵recursion
作者: hk8guy    時間: 2019-4-16 20:36

就題目而言,呢個係蠢既方法
快既方法去搵recursion
天下無雙 發表於 2019-4-16 19:59


冇錯, 呢個完全係brute force
作者: Mr.K    時間: 2019-4-16 21:20

就咁應該得
hk8guy 發表於 2019-4-16 12:09



    請受小弟一拜,一開始我都係咁寫,只係錯左一步就愈寫愈錯,依家明白果一步錯左咩
作者: marlin12    時間: 2019-4-16 21:38

本帖最後由 marlin12 於 2019-4-16 21:42 編輯
就題目而言,呢個係蠢既方法
快既方法去搵recursion
天下無雙 發表於 2019-4-16 19:59

雖然我都唔覺得[hk8guy]師兄的方法好,但是他的方法確實比recursion快很多。

[hk8guy]師兄的方法,用咗1275ms。
  1. console.time('elapsed');

  2. const patterns = [];

  3. for (let i1 = 1; i1 <= 44; i1++) {
  4.   for (let i2 = i1 + 1; i2 <= 45; i2++) {
  5.     for (let i3 = i2 + 1; i3 <= 46; i3++) {
  6.       for (let i4 = i3 + 1; i4 <= 47; i4++) {
  7.         for (let i5 = i4 + 1; i5 <= 48; i5++) {
  8.           for (let i6 = i5 + 1; i6 <= 49; i6++) {
  9.             patterns.push( [i1, i2, i3, i4, i5, i6] );
  10.           }
  11.         }
  12.       }
  13.     }
  14.   }
  15. }

  16. console.timeEnd('elapsed');
複製代碼
recursion方法,用咗6537ms。
  1. function combinations( n, r ) {
  2.   const pattern = [],
  3.         patterns = [];

  4.   function worker( begin, end, offset ) {
  5.     for( let x = begin; x <= end; x++ ) {
  6.       pattern[offset] = x;

  7.       if( offset === r - 1 ) {
  8.         patterns.push( pattern.slice() );
  9.       } else {
  10.         worker( x + 1, end + 1, offset + 1 );
  11.       }
  12.     }
  13.   }

  14.   worker( 1, n - r + 1, 0 );

  15.   return patterns;
  16. }

  17. console.time('elapsed');
  18. const results = combinations(49, 6);
  19. console.timeEnd('elapsed');
複製代碼

作者: freefdhk    時間: 2019-4-17 01:53

雖然我都唔覺得[hk8guy]師兄的方法好,但是他的方法確實比recursion快很多。

[hk8guy]師兄的方法,用咗12 ...
marlin12 發表於 2019-4-16 21:38



    recursion 係最精簡, 但係慢.
所以如果要好有效率既情況, 可能hard code 直接行係最快. 吾 call function / call 自己
作者: alan11abc    時間: 2019-4-17 02:09

平行佢啦
作者: seasky    時間: 2019-4-17 11:32

提示: 作者被禁止或刪除 內容自動屏蔽
作者: seasky    時間: 2019-4-17 11:39

提示: 作者被禁止或刪除 內容自動屏蔽





歡迎光臨 電腦領域 HKEPC Hardware (https://h0.hkepc.com/forum/) Powered by Discuz! 7.2