JavaScript常用算法详解:迭代、递推、穷举与递归实战

作者:函数茶馆时间:2026-10-22 20:49:57浏览:612

本文深入解析JavaScript中四种常用算法:累加累积、迭代、递推、穷举与递归。通过小球落地、阶乘、最大公约数、兔子繁殖及百钱买百鸡等具体案例,详细讲解各算法的核心逻辑、初始化条件、循环控制及代码实现,帮助开发者掌握基础算法思维与编程技巧。

累加与累积算法基础

累加和累积是算法中的基础概念。

累加指的是将一系列数据逐步累加到一个变量中,最终得到总和结果。

例如,计算从1到100所有整数的累加和。

另一个典型例子是:小球从一定高度落下,每次反弹回原高度的一半,求第十次落地时小球经过的总路程。


<script>
  var h=100;
  var s=0;
  for(var i=0;i<10;i++){
    h=h/2;
    s+=h;
  }
  s=s*2+100;
</script>

累积则是将一系列数据相乘并累乘到一个变量中,最终得到乘积结果。

最常见的累积应用是计算n的阶乘。


var n=100;
var result= 1;
for(var i=1;i<=n;i++){
  result*=i;
}

其一般形式如下所示。

累加公式为:V +=e;

累积公式为:v*=e;

其中,V代表累加和或累积结果,e代表参与运算的累加或累积项。

算法实现的关键要点包括:

(1) 初始化阶段

需要对变量v和e进行初始化。

对于累加操作,v的初始值通常设为0;

对于累积操作,v的初始值通常设为1。

e的初始化较为灵活,如果累加或累积项结构复杂,可能需要分解为多个子项分别初始化。例如在计算圆周率时,累加项可分解为符号、分子和分母三部分分别处理。

(2) 循环的控制条件

控制条件主要有两种情况:一种是固定次数,例如计算弹跳距离或数列前20项之和;

另一种是条件触发,即循环次数不固定,需满足特定条件。例如计算圆周率时,要求最后一项的绝对值小于10的-6次方。

(3) 确定累加/积项的变化规律

以数列前20项之和为例,变化规律是将当前分子与分母之和作为下一次的分母,而当前的分母作为下一次的分子。

在求圆周率的例子中,变化规律是将符号取反,分母加2,从而得出下一项。

迭代法应用解析

迭代法

迭代法也被称为辗转法。

其核心规律是:不断利用旧值推导出新值,直到获得期望的结果。

解决迭代问题的步骤如下:

1. 找到迭代的变量(即旧值)。

2. 确定迭代之间的关系。

3. 明确期望的结果(即结束循环的条件)。

  • (1) 已知最终结果的情况
  • (2) 已知循环次数的情况

<script>
  /*
  * 1.接受用户输入的俩个数
  * 2.一个函数的到最大公约数
  * 3.打印这个最大公约数*/
  varnum1 = Number(prompt("请输入一个数"));
  var num2 = Number(prompt("请输入一个数"));
  var result = GCD(num1,num2);
  alert(result);
  /*
  * 函数的功能:得到最大公约数
  * 函数名:GCD
  * 函数的参数:俩个整数
  * 返回值:最大公约数*/
  /*
  * 如果num1<num2则交换,确保num1是交大的
  * 计算余数
  * 当num1(除数),对num2(被除数)的余数不为0,重复一下步骤
  * num2=>num1,
  * 余数=>num2
  * 重新计算余数
  * 最终的到最大公约数,也就是num2的值*/
  functionGCD(num1,num2){
    /*return0;*/
    if(num1<num2){
     var t = num1;
      num1=num2;
      num2 = t;
    }
    var remainder = num1%num2;
    while(remainder!= 0){
      num1=num2;
      num2= remainder;
      remainder=num1%num2;
    }
    returnnum2;
  }
</script>

递推与穷举策略

递推法

递推旨在找到数学规律,通过公式计算下一项的值,直至得到所需结果。

例如兔子产子问题:通过前两项的值推导出下一项的值。


<script>
  /*
  * 一般而言,兔子在出生俩个月后,就有繁殖能力
  * 一对兔子每个月能生出一对小兔子来
  * 如果所有的兔子都不死,那么一年以后总共有多少对兔子*/
  /*
  * 月份 0 1 2 3 4 5 6
  * 幼崽 1 1 1 2 3 5 8
  * 成年 0 0 1 1 2 3 5
  * 总共 1 1 2 3 5 8 13
  * */
  /*
  * 接收用户输入的月份
  * 计算兔子的对数
  * (1)如果经过的月份<2那么兔子的对数为1
  * (2)否则用初始的兔子的对数 加上  第一个月的对数为
  * 第二个月兔子的个数(an = an-1 +an-2)
  * 反复使用这个公式,计算出下个月兔子的个数一直到用户输入的月份为止
  * 打印的兔子的对数
  * */
  /* var month = Number(prompt("输入月份"));
   var sum ;
   var an =1;
   var an_1=1;
   var an_2;
   if(month < 2){
   sum=1;
   }else{
   sum=2;
   for(var i=1; i<month; i++){
   sum= an +an_1;
   an_1 =an;
   an = sum;
   }
   }
   alert(sum);*/
  /*
  * 思路2*/
  varmonth = Number(prompt("输入月份"));
  var rabbit = [1,1];
  for(varm=2;m<=month;m++){
    rabbit[m]=rabbit[m-1]+rabbit[m-2];
  }
  alert(rabbit[month]);
</script>

递推可分为顺推和逆推两种形式。

穷举法

当遇到问题且找不到更优解法(如缺乏数学公式或规律)时,可使用“穷举”这一“笨”办法。利用计算机运算速度快的特点,列出所有可能性。

在列举过程中,记录符合预期条件的结果。


script>
  /*
  * 公鸡一值钱5,鸡母一值钱三,鸡仔三值钱一
  * 百钱买百鸡,问公鸡,鸡母、鸡仔各几何?
  * x y z
  * x + y + z = 100
  * x*5 + y * 3 + z/3 = 100*/
  for(varcock=0;cock<=20;cock++){
    for(varhen=0;hen<=33;hen++){
      var chihen=100-cock-hen;
      if(100== cock*5+ hen*3+ chihen/3){
        document.write("公鸡一共:"+cock+"鸡母一共:"+hen+"小鸡一共:"+chihen+"<br>")
      }
    }
  }
</script>

穷举法的特点是算法和程序结构简单,但计算量通常很大。然而,计算机的高速运算能力可以扬长避短,往往能取得不错的效果。

案例:寻找一个三位数,其个位数字大于百位数字,百位数字又大于十位数字,且各位数字之和等于各位数字相乘之积。

递归算法详解

递归法

所谓递归,是指在函数内部调用函数自身。

例如,在求阶乘的fact函数内部,再次调用fact函数。


<script>
  /*计算n的阶乘*/
  functionfact(n){
    if(1== n){
      return1
    }
     returnn*fact(n-1);
  }
  alert(fact(5));
</script>

若按常规思路理解递归,层层嵌套调用与返回过程会显得非常复杂。不妨换个角度思考:

递归的本质是将规模为n的问题降阶为n-1的问题进行求解,即寻找n与n-1之间的关系。

总结

以上就是本文的全部内容,希望这些内容对大家的学习或工作具有参考价值。感谢支持,如需了解更多相关内容,请查看相关链接。

作者最新文章