算法——1.循环、遍历、递归、迭代

这几个词汇都与重复有关。

  1. 循环:最基础的概念,指所有重复的行为
  2. 递归:在函数内调用自身,将复杂情况逐步转化为基本情况
  3. 迭代:在多次循环中逐步接近结果,每一次迭代的结果会作为下一次迭代的初始值
  4. 遍历:按规则访问非线性结构中的每一项

1. 迭代与递归

先举例:计算 n!
使用递归:

  public int factorial(int n) {
      if (n == 1) {
          return 1;
      }
      return n * factorial(n - 1);
  }

使用迭代:

public int factorial(int n) {
   int product = 1;
   for (int i = 2; i < n; i++) {
       product *= i;
   }
   return product;
}

递归和迭代理论上可以相互转换。但实际从算法结构来说,递归声明的结构并不总能转换为迭代结构(有些结构在设计初期用迭代很难实现,如图、网格等)
原理上讲:所有递归都是可消除的,比如自己维护栈的形式。

举例:
求解斐波那契数列:

F(n) = F(n−1) + F(n−2)

递归法:

public int fabonacci(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    return fabonacci(n - 1) + fabonacci(n - 2);
}

递归转迭代:

public int fabonacci(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    int fx = 1;
    int fy = 1;
    int fz = 0;
    for (int i = 2; i <= n; i++) {
        fz = fx + fy;
        fx = fy;
        fy = fz;
    }
    return fz;
}

使用栈消除递归:

自己模拟栈
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值