• 算法笔记_day1_循环设计


    累加:S(N)=S(N-1)+a;

    累乘:  S(N)=S(N-1)*a;

    ey:求:1/1!-1/3!+1/5!-1/7!+...+(-1)^(n+1)/(2n-1)!

    分析:这个问题既有累加也有累乘,

       数学模型:S(N)=S(N-1)+(-1)^(n+1)/(2n-1)!

    算法模型:

    1.求阶乘:

      for(i=2;i<=n;i++)

      {

        t=1;

        for(j=1;j<=2*i-1;j++)

          t=t*j;

      }

    上面是(2n-1)!,类似的还有n!,(2n+1)!,也就是j的比较条件不同,用双层循环解决。这里面就不介绍递归了。

    2.求(-1)^(n+1):

      这个就是一个旗帜,遇到偶数项时就是-1;奇数项就是+1,;

      用循环:

        sign=1;//n=1时

        for(j=1;j<=i+1;j++)

          sign=sign*(-1);//sign=-sign;

    3.求和s:  

      int s=1;

      在内层循环里面:

      s=s+sign/t;

    完整代码:

      input(n);

      float s=1,t=1;

      int i,j;

      int sign=1;

      for(i=2;i<=n;i++)

      {

        for(j=1;j<2*i-1;j++)

          t=t*j;

        for(j=1;j<i+1;j++)

          sign=sign*(-1);

        s=s+sign/t;

      }

      print(n);

    算法分析:

      算法时间复杂度是O(N^2),效率太低,

      原因分析:1.当第一次求出3!,再求5!就没有必要去从1累乘到5,而是可以从3!*4*5,就是可以,

           数学模型:A(N)=A(n-1)*1/(2n-2)*1/(2n-1) 

           2.sign=-sign;也可以减少循环。n*(n-1)/2次

            对(-1)^(n+1)可以用一个变量sign记录他的值,每循环一次执行sign=-sign;

    改进代码:

      int i;

      float s=1,t=1;

      input(n);

      for(i=2;i<n;++i)

      {

        sign=-sign;

        t=t*(2*i-2)*(2*i-1);

        s=s+sign/t;

      }

      print(s);

    算法分析:算法时间复杂度是O(n).

               

  • 相关阅读:
    python中创建列表、元组、字符串、字典、集合
    python中字典的键不允许重复
    python中生成字典
    python中实现列表元素的倒序排列
    python中实现字典的逆向排列
    python中增加字典的键值对(项)、修改键值对的值
    python中访问字典
    Fortran 2003:完美还是虚幻?(节选)
    感谢裘宗燕老师!
    “符号化”的效用和缺失
  • 原文地址:https://www.cnblogs.com/wust221/p/3033863.html
Copyright © 2020-2023  润新知