作者: Mr.K 時間: 2019-4-16 02:25 標題: 六合彩全餐 for loop 問題
整左好似,可能我轉左牛角尖

明明好似好簡單,唔知做咩愈寫愈多野
請教下,我轉錯左咩方向
- calc ();
- var box = [];
- var count = 0;
- function calc (){
- for (var t = 0; t <= 49; t ++){
- for (var i = 1; i <= 49; i ++){
- calcitam (i, t);
- }
- }
- console.log (count);
- }
- function calcitam (num, level){
- for (var tn = 0; tn < 6; tn ++){
- for (var t = 0; t <= 49; t ++){
- var d = (tn == 0) ? num + t : num + level;
- for (var i = d; i <= 44; i ++){
- var tmps = [];
- tmps.push (i);
- var d2 = (tn == 1) ? d + 1 + t : d + 1 + level;
- if (d2 <= 49){
- for (var i2 = d2; i2 <= d2; i2 ++){
- var tmps2 = tmps;
- tmps2.push (i2);
- var d3 = (tn == 2) ? d2+ 1 + t : d2 + 1 + level;
- if (d3 <= 49){
- for (var i3 = d3; i3 <= d3; i3 ++){
- var tmps3= tmps2;
- tmps3.push (i3);
- var d4 = (tn == 3) ? d3 + 1 + t : d3 + 1 + level;
- if (d4 <= 49){
- for (var i4 = d4; i4 <= d4; i4 ++){
- var tmps4 = tmps3;
- tmps4.push (i4);
- var d5 = (tn == 4) ? d4 + 1 + t : d4 + 1 + level;
- if (d5 <= 49){
- for (var i5 = d5; i5 <= d5; i5 ++){
- var tmps5 = tmps4;
- tmps5.push (i5);
- var d6 = (tn == 5) ? d5 + 1 + t : d5 + 1 + level;
- if (d6 <= 49){
- for (var i6 = d6; i6 <= d6; i6 ++){
- var tmps6 = tmps5;
- tmps6.push (i6);
- if (i6 <= 49){
- var result = tmps6.filter(function(element, index, arr){
- return arr.indexOf(element) === index;
- })
- if (result.length == 6){
- if (box.indexOf (tmps6.sort((a,b) => a - b).join(",")) == -1){
- box.push (tmps6.sort((a,b) => a - b).join(","));
- //console.log (tmps6);
- count ++;
- }
- }
- }
- tmps6.pop ();
- }
- }
- tmps5.pop ();
- }
- }
- tmps4.pop ();
- }
- }
- tmps3.pop ();
- }
- }
- tmps2.pop ();
- }
- }
- tmps.pop ();
- }
- }
- }
- }
作者: 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
一開始諗住應該好簡單,loop六次姐,點知寫下寫下就咁多
作者: Mr.K 時間: 2019-4-16 11:21
係後尾到 sort反左做哂
作者: Mr.K 時間: 2019-4-16 11:22
原本諗住 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
用level呢個方法有D怪, 所以會有太多if, 同埋中間for loop(i2, i3...)都係loop 一次
作者: hk8guy 時間: 2019-4-16 12:09
就咁應該得
- for (i1 = 1; i1 <= 44; i1++) {
- for (i2 = i1 + 1; i2 <= 45; i2++) {
- for (i3 = i2 + 1; i3 <= 46; i3++) {
- for (i4 = i3 + 1; i4 <= 47; i4++) {
- for (i5 = i4 + 1; i5 <= 48; i5++) {
- for (i6 = i5 + 1; i6 <= 49; i6++) {
- ...;}
- }
- }
- }
- }
- }
作者: 天下無雙 時間: 2019-4-16 19:59
就題目而言,呢個係蠢既方法
快既方法去搵recursion
作者: hk8guy 時間: 2019-4-16 20:36
冇錯, 呢個完全係brute force

作者: Mr.K 時間: 2019-4-16 21:20
請受小弟一拜,一開始我都係咁寫,只係錯左一步就愈寫愈錯,依家明白果一步錯左咩
作者: marlin12 時間: 2019-4-16 21:38
本帖最後由 marlin12 於 2019-4-16 21:42 編輯
雖然我都唔覺得[hk8guy]師兄的方法好,但是他的方法確實比recursion快很多。
[hk8guy]師兄的方法,用咗1275ms。
- console.time('elapsed');
- const patterns = [];
- for (let i1 = 1; i1 <= 44; i1++) {
- for (let i2 = i1 + 1; i2 <= 45; i2++) {
- for (let i3 = i2 + 1; i3 <= 46; i3++) {
- for (let i4 = i3 + 1; i4 <= 47; i4++) {
- for (let i5 = i4 + 1; i5 <= 48; i5++) {
- for (let i6 = i5 + 1; i6 <= 49; i6++) {
- patterns.push( [i1, i2, i3, i4, i5, i6] );
- }
- }
- }
- }
- }
- }
- console.timeEnd('elapsed');
- function combinations( n, r ) {
- const pattern = [],
- patterns = [];
- function worker( begin, end, offset ) {
- for( let x = begin; x <= end; x++ ) {
- pattern[offset] = x;
- if( offset === r - 1 ) {
- patterns.push( pattern.slice() );
- } else {
- worker( x + 1, end + 1, offset + 1 );
- }
- }
- }
- worker( 1, n - r + 1, 0 );
- return patterns;
- }
- console.time('elapsed');
- const results = combinations(49, 6);
- console.timeEnd('elapsed');
作者: freefdhk 時間: 2019-4-17 01:53
recursion 係最精簡, 但係慢.
所以如果要好有效率既情況, 可能hard code 直接行係最快. 吾 call function / call 自己
作者: alan11abc 時間: 2019-4-17 02:09
平行佢啦

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

