javascript:为for循环创建for循环
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript:为for循环创建for循环,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6283字,纯文字阅读大概需要9分钟。
内容图文
![javascript:为for循环创建for循环](/upload/InfoBanner/zyjiaocheng/708/d3ec92340dca43b98ed1508f4bd75169.jpg)
我不得不解决以下问题:
9个值,从1到9(不接受0和10),所有数字都需要不同.
为了解决这个问题,我为循环中的循环制作了那些可怕的东西.
(我添加了2个条件来检查我是否有其中一个解决方案)
它工作正常,但我想知道如何以更好的方式在for循环中创建for循环?
而且,每个数字不能等于另一个.你怎么能比我做到这一点呢? (同样,可以删除2个第一个条件)
这是代码:
var a = 1, b = 1, c = 1, d = 1, e = 1, f = 1, g = 1, h = 1, i = 1;
var x = 0;
var result = [];
function calc(){
x = a + 13 * b / c + d + 12 * e - f - 11 + g * h / i - 10;
if(x == 66){
result.push([a, b , c , d , e, f, g, h, i] );
}
}
for(a = 1; a < 10; a++){
calc();
for(b = 1; b < 10; b++){
calc();
for(c = 1; c < 10; c++){
calc();
for(d = 1; d < 10; d++){
calc();
for(e = 1; e < 10; e++){
calc();
for(f = 1; f < 10; f++){
calc();
for(g = 1; g < 10; g++){
calc();
for(h = 1; h < 10; h++){
calc();
for(i = 1; i < 10; i++){
calc();
}
}
}
}
}
}
}
}
}
console.log(result);
var result2 = result.filter(function(el){
return el[0] == 5 && el[1] == 9 && el[0] != el[1] && el[0] != el[2] && el[0] != el[3] && el[0] != el[4] && el[0] != el[5] && el[0] != el[6] && el[0] != el[7] && el[0] != el[8] && el[1] != el[0] && el[1] != el[2] && el[1] != el[3] && el[1] != el[4] && el[1] != el[5] && el[1] != el[6] && el[1] != el[7] && el[1] != el[8] && el[2] != el[0] && el[2] != el[1] && el[2] != el[3] && el[2] != el[4] && el[2] != el[5] && el[2] != el[6] && el[2] != el[7] && el[2] != el[8] && el[3] != el[0] && el[3] != el[1] && el[3] != el[2] && el[3] != el[4] && el[3] != el[5] && el[3] != el[6] && el[3] != el[7] && el[3] != el[8] && el[4] != el[0] && el[4] != el[1] && el[4] != el[2] && el[4] != el[3] && el[4] != el[5] && el[4] != el[6] && el[4] != el[7] && el[4] != el[8] && el[5] != el[0] && el[5] != el[1] && el[5] != el[2] && el[5] != el[3] && el[5] != el[4] && el[5] != el[6] && el[5] != el[7] && el[5] != el[8] && el[6] != el[1] && el[6] != el[2] && el[6] != el[3] && el[6] != el[4] && el[6] != el[5] && el[6] != el[7] && el[6] != el[8] && el[7] != el[0] && el[7] != el[1] && [7] != el[2] && el[7] != el[3] && el[7] != el[4] && el[7] != el[5] && el[7] != el[6] && el[7] != el[8] && el[8] != el[0] && el[8] != el[1] && el[8] != el[2] && el[8] != el[3] && el[8] != el[4] && el[8] != el[5] && el[8] != el[6] && el[8] != el[7];
});
console.log(result2);
解决方法:
对于初学者,你可以像这样使N x嵌套for循环
您可以将您的问题作为9位数生成来处理
由于您的数字不重复,您可以丢弃许多迭代.如果以上述方式编码(如嵌套),你会想到这样的东西:
C中的广义排列(无重复):
//---------------------------------------------------------------------------
//--- permutation class ver 0.00 --------------------------------------------
//---------------------------------------------------------------------------
#ifndef _permutation_h
#define _permutation_h
/*---------------------------------------------------------------------------
// usage:
permutation per;
per.alloc(N);
per.first();
for (;;)
{
... here per.i[0..N-1] contains actual permutation
... N! permutations
if (!per.next()) break;
}
//-------------------------------------------------------------------------*/
class permutation
{
public:
int *i; // i[N] permutation
BYTE *a; // a[N] item not used yet ?
int N; // items
int ix; // actual permutation layer
permutation() { N=0; i=NULL; a=NULL; ix=0; }
permutation(permutation& b) { *this=b; }
~permutation() { free(); }
permutation* operator = (const permutation *b) { *this=*b; return this; }
permutation* operator = (const permutation &b) { alloc(b.N); for (int j=0;j<N;j++) { i[j]=b.i[j]; a[j]=b.a[j]; } ix=b.ix; return this; }
void alloc(int _N)
{
free();
i=new int[_N];
if (i==NULL) return;
a=new BYTE[_N];
if (a==NULL) { free(); return; }
N=_N;
}
void free ()
{
N=0; ix=0;
if (i!=NULL) delete i; i=NULL;
if (a!=NULL) delete a; a=NULL;
}
void first() // init permutation
{
for (ix=0;ix<N;ix++)
{
i[ix]=ix;
a[ix]=0;
} ix--;
}
bool next() // next permutation return if it is not last
{
int *ii=&i[ix];
for (;;)
{
if (*ii>=0) a[*ii]=1;
for ((*ii)++;*ii<N;(*ii)++) if (a[*ii]) { a[*ii]=0; break; }
if (*ii>=N)
{
if (ix== 0) return false;
*ii=-1; ix--; ii=&i[ix];
}
else{
if (ix==N-1) return true;
ix++; ii=&i[ix];
}
}
}
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
重要的是在first()和next()成员中,每个排列都作为索引存储在i []数组中,因此设置N = 9,输出数将是(per.i [0] 1),(per.我[1] 1),…,(per.i [9] 1)
它以下列方式工作:
> first()将置换初始化为状态i [9] =(0,1,2,… 8)和a [9] =(0,0,0,… 0)
我会这样简单地写这个:i = 012345678,a = 000000000 where
> ix指向最后一位数
>我是实际的排列
>如果数字未使用(1)或使用(0)(避免O(N ^ N)操作)的标志
> next()递增到下一个有效排列
将最后一位数增加到下一个未使用的值.如果没有未使用的值将其设置为未使用并增加前一个数字.溢出也是如此.第一次迭代将是这样的:
i=012345678,a=000000000 // starting iteration
i=01234567? a=000000001 // unset (no unused values)
i=01234568? a=000000010 // increment 8th digit
i=012345687 a=000000000 // set the last digit result
下一次迭代:
i=012345687 a=000000000 // starting iteration
i=01234568? a=000000010 // unset (no unused values)
i=0123456?? a=000000011 // unset (8->9 overflow)
i=0123457?? a=000000101 // increment 7th digit
i=01234576? a=000000001 // after overflow digit set to lowest free value
i=012345768 a=000000000 // after overflow digit set to lowest free value
我希望它足够清楚.
如果您使用递归而不是迭代,那么粗略的代码看起来会更好,但是在大多数语言中,由于堆栈/堆垃圾而运行速度也会变慢
正如@NikolaDimitroff指出这是在C而不是javascript所以:
>忽略new,delete和类成员,然后是first(),next()
>设定N = 9;和数组i,a可以是静态的:int i [9]; BYTE a [9];
这里C的任务的解决方案O(N!):
int a,b,c,d,e,f,g,h,i;
permutation per;
per.alloc(9);
per.first();
for (;;)
{
if ((per.i[0]+1)
+(13*(per.i[1]+1)/(per.i[2]+1))+(per.i[3]+1)
+(12*(per.i[4]+1))
-(per.i[5]+1)-11
+((per.i[6]+1)*(per.i[7]+1)/(per.i[8]+1))-10
==66)
{
a=per.i[0]+'1';
b=per.i[1]+'1';
c=per.i[2]+'1';
d=per.i[3]+'1';
e=per.i[4]+'1';
f=per.i[5]+'1';
g=per.i[6]+'1';
h=per.i[7]+'1';
i=per.i[8]+'1';
// here a,b,c,d,e,f,g,h,i holds the solution
break;
}
if (!per.next()) break;
}
内容总结
以上是互联网集市为您收集整理的javascript:为for循环创建for循环全部内容,希望文章能够帮你解决javascript:为for循环创建for循环所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。