前段时间学习算法方面的知识看了一下用C语言写的一些简单的算法自己用js模拟实现一遍现在整理出来和大家分享一下。
- 河内塔
- 斐波那契数列
- 巴斯卡三角形
- 三色棋
河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时
北越的首都,即现在的胡志明市;1883年法国数学家Edouard Lucas曾提及这个故事,据说创世
纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64
个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根
石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬
运完毕之时,此塔将毁损,而也就是世界末日来临之时。
1 let hanoi = function(n,a,b,c){ 2 if( n == 1 ){ 3 console.log( n,a,c ) 4 }else{ 5 hanoi( n -1 ,a,b,c ); 6 console.log( n,a,c ); 7 hanoi( n-1,b,a,c ); 8 } 9 } 10 hanoi( 3,‘a‘,‘b‘,‘c‘ );
Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免
子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三
只免子,三个月后有五只免子(小免子投入生产)......。
如果不太理解这个例子的话,举个图就知道了,注意新生的小免子需一个月成长期才会投入生
产,类似的道理也可以用于植物的生长,这就是Fibonacci数列,一般习惯称之为费氏数列,例
如以下: 1、1 、2、3、5、8、13、21、34、55、89......
1 //递归 2 let fibonacci = function(n){ 3 if( n == 1 || n == 2 ) return 1; 4 5 return fibonacci(n - 1 ) + fibonacci( n - 2 ); 6 } 7 // console.log( fibonacci(10) ); 8 //非递归 9 let fib = function(n){ 10 //第i项为前两项之和 11 var res = [1,1]; 12 if( n == 1 || n ==2 ){ 13 return 1; 14 } 15 for( var i = 2; i < n; i++ ){ 16 res[i] = res[i - 1] + res[i - 2]; 17 } 18 return res[n - 1]; 19 } 20 console.log( fib( 5 ) );
巴斯卡三角形
1 let combi = function (n,r){ 2 3 var i,p = 1; 4 for( i=1; i<= r;i++ ){ 5 p = p* ( n - i + 1 )/i; 6 7 } 8 return p; 9 } 10 11 let paint = function(N){ 12 var n,r,t; 13 for( n = 0;n <= N; n++ ){ 14 for( r = 0;r <= n;r++ ){ 15 //排版设定开始 16 if( r == 0 ){ 17 var i; 18 for( i = 0;i <= (N - n);i++ ){ 19 document.write(" "); 20 } 21 }else{ 22 document.write(" "); 23 }//排版设定结束 24 document.write(combi(n,r)); 25 } 26 document.write( "<br/>" ); 27 } 28 } 29 paint( 5) 30 console.log( "%30d",5 );
AlgorithmGossip:三色棋
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰
人),而多数的作者则使用Three-Color Flag来称之。
假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您
希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上
进行这个动作,而且一次只能调换两个旗子。
1 //交换函数 2 let swap = function(obj,x,y){ 3 var temp = obj[x]; 4 obj[x] = obj[y]; 5 obj[y] = temp; 6 7 } 8 9 10 11 let threeColorFlags = function(){ 12 var color = [‘r‘,‘w‘,‘b‘,‘w‘,‘w‘,‘b‘,‘r‘,‘b‘,‘w‘,‘r‘]; 13 var leftColor = ‘b‘; 14 var rightColor = ‘r‘; 15 var lindex = 0,rindex = color.length - 1; 16 for( var i = 0 ; i <= rindex;i++ ){ 17 18 if( color[i] == leftColor){ 19 swap( color,lindex,i ); 20 lindex++; 21 }else if ( color[i] == rightColor ){ 22 23 while( rindex > i ){ 24 if( color[rindex] == rightColor){ 25 rindex--; 26 }else{ 27 break; 28 } 29 } 30 swap( color,rindex,i ); 31 rindex--; 32 i--; 33 } 34 } 35 console.log( color ); 36 } 37 threeColorFlags();