- 注册时间
- 2010-7-23
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 851
- 在线时间
- 小时
|
发表于 2010-8-10 10:49:32
|
显示全部楼层
以下八皇后问题,测试的是函数递归调用的速度,一直想看看lua的速度,但不会写代码,谁能帮忙写一个?- // 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
- // Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
- // Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
- // 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。
-
- // 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
- // 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
- // 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
- // 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
- // 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
-
- //Forcal源程序
- i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
- i:test(row, ld, rd : pos,p : sum,upperlim)=
- {
- which { row != upperlim,
- { pos = and{upperlim , not[row.or(ld).or(rd)]},
- while{ pos,
- p = and(pos,-pos),
- pos = pos -p,
- test(row+p, shl(ld+p,1), shr(rd+p,1))
- }
- },
- sum++
- }
- };
- i:main(:tm,n:sum,upperlim)=
- {
- n=15,
- tm=sys::clock(),
- printff{"\r\nQueens:{1,i} , ",n},
- upperlim=shl(upperlim,n)-1,
- test(0,0,0),
- printff{"sum:{1,i} , {2,i} millisecond.\r\n",sum,sys::clock()-tm}
- };
-
- //完成相同功能的C++程序
- /*
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
-
- long sum=0,upperlim=1;
-
- void test(long row, long ld, long rd){
-
- if (row != upperlim){
- long pos = upperlim & ~(row | ld | rd);
- while (pos){
- long p = pos& -pos;
- pos -= p;
- test(row+p, (ld+p)<<1, (rd+p)>>1);
- }
- }
- else
- sum++;
- }
-
- int main(int argc, char *argv[])
- {
- time_t tm;
- int n=15;
-
- if(argc!=1)n=atoi(argv[1]);
- tm=time(0);
- if((n<1)||(n>32))
- {
- printf(" heh..I can’t calculate that.\n");
- exit(-1);
- }
- printf("%d Queens\n",n);
- upperlim=(upperlim<<n)-1;
-
- test(0,0,0);
- printf("Number of solutions is %ld, %d seconds\n", sum,(int)(time(0)-tm));
- }
- */
复制代码 |
|