javascript 算法

前段时间学习算法方面的知识看了一下用C语言写的一些简单的算法自己用js模拟实现一遍现在整理出来和大家分享一下。

  1. 河内塔
  2. 斐波那契数列
  3. 巴斯卡三角形
  4. 三色棋

河内之塔(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("&nbsp;&nbsp;");
20               }
21             }else{
22                 document.write("&nbsp;&nbsp;");
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();

未完结持续更新。。。。

时间: 2024-10-09 21:40:53

javascript 算法的相关文章

关于JavaScript算法的几个小练习--DonyZ

各位小伙伴们,以下的内容来自于我在freecodecamp上做的练习,这是一个很好的学习平台,在此分享给大家,下面的题目答案在文章的最后(答案都是我自己写的,虽然都写出来了,可并不一定是最好的写法,所以希望能和大家一起交流,嘿嘿),并且会持续更新关于JavaScript算法的文章,希望小伙伴们能多多交流,互相学习 1.翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串. 例如:reverseString("hello

Javascript算法系列之快速排序(Quicksort)

Javascript算法系列之快速排序(Quicksort) 原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gist.github.com/paullewis/1981455#file-gistfile1-js 快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格 核心的思想就是通过一趟排序将要排序的数据分割成独立的

JavaScript算法题之–随机数的生成

JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2     length = 100, 3     i = 0; 4   5 for( ; i < length; i++ ){ 6     arr.push( i ); 7 } 从一个长度为 100 的有序数组中随机拿出 10 个随机的数,并且不能有重复. 方法1:随机抽取法 01 var gRandomAr

JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n).1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行. 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 自上而下的递归(所有递归的方法都可以用

JavaScript算法(归并排序与快速排序)

归并排序与快速排序这两个算法放在一起,也是因为时间复杂度都是对数级别的. 目前看过的资料,归并排序看<学习JavaScript数据结构与算法>介绍的归并排序吧,快速排序直接看百度百科,讲的不错.通过这两份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 和之前的一样,嗯,<学习JavaScript数据结构与算法>这本书里都有现成ES5代码,就不在这儿写了,关键是弄清楚原理,然后JS代码每天写两遍,就OK了.ES6的代码周五之

FCC上的javascript算法题之中级篇

FCC中的javascript中级算法题解答 中级算法的题目中用到了很多js的知识点,比如迭代,闭包,以及对json数据的使用等等,现在将自己中级算法的解答思路整理出来供大家参考讨论.欢迎大家提出新的思路,写出更简单的解法. 1.给一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 说明:最小的数字并非总在最前面 如:sumAll([4, 1]) 应该返回 10. sumAll([5, 10]) 应该返回 45. function sumAll(arr) { var max=Math

JavaScript算法(冒泡排序、选择排序与插入排序)

冒泡排序.选择排序与插入排序复杂度都是指数级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看<计算机科学概论(第三版)>里介绍的选择排序,插入排序看<计算机科学概论(第11版)>里介绍的插入排序, 通过这三份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 嗯,这本书里都有现成代码,就不在这儿写了,关键是弄清楚原理,然后

JavaScript算法练习:阶乘(Factorial)函数

Factorial称之为阶乘,维基百科是这样描述的“一个正整数的阶乘是所有小于及等于该数的正整数的积,并且有0的阶乘为1.自然数n的阶乘写作n!.” 而阶乘函数是递归(Haskell)函数典型示例.在JavaScript中可能运用到递归函数.但在实际使用中,你可能没有考虑何时何地递归是有用的,或者使用不好会带来很多问题. 在这篇文章中我们来看看JavaScript如何实现阶乘的功能. 阶乘函数 先来简单的看看数学上阶乘函数,开头也说过,阶乘函数的参数是一个自然数,它返回1与此数之间所有数的乘积.

javascript算法挑战

1.翻转字符串算法挑战: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 function reverseString(str) { arr = str.split(''); str = arr.reverse().join(''); return str; } reverseString("hello"); 2.阶乘算法挑战: 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手,看到的不喜勿喷,还望大神指教. 随着Node.js,Angular.js,JQuery的流行,点燃了我学习JavaScript的热情!以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现,加快学习JS的步伐(用这个办法方便跟自己以前学过的C++语言作对比,找出不同),希望自己能够坚持下去!!! 首先来个汉诺塔的. <script>      function hanoi(n,a,b,c){          if(n==1){              documen