递归算法学习

  1. package com.example.interview.augom;
  2. //递归算法学习
  3. public class test1 {
  4. public static void main(String[] args) {
  5. //斐波那契数列
  6. int i = 1;
  7. for (i = 1; i <= 20; i++) {
  8. System.out.println("兔子第" + i + "个月的总数为:" + f(i));
  9. }
  10. //1……到100的和
  11. System.out.println(new test1().num100(10));
  12. //阶乘
  13. System.out.println(new test1().fact(3));
  14. }
  15. public int numT(int i) {
  16. System.out.print(i);
  17. i--;
  18. //结束条件
  19. if (i <= 0) {
  20. return 0;
  21. }
  22. return numT(i);
  23. }
  24. //1……100
  25. public int num100(int i) {
  26. if (i == 1) {
  27. return 1;
  28. } else
  29. return i + num100(i - 1);
  30. }
  31. //斐波那契数列
  32. public static int f(int x) {
  33. //条件
  34. if (x == 1 || x == 2) {
  35. return 1;
  36. } else
  37. //递归满足的函数是这个
  38. return f(x - 1) + f(x - 2);
  39. }
  40. //阶乘
  41. public int fact(int i) {
  42. if (i == 1) {
  43. return 1;
  44. } else {
  45. return i * fact(i - 1);
  46. }
  47. }
  48. }

递归学习网站

什么是递归?

递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归表现为函数调用函数本身。在知乎看到一个比喻递归的例子,个人觉得非常形象,大家看一下:

递归最恰当的比喻,就是查词典。我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。

来试试水,看一个递归的代码例子吧,如下:

  1. public int sum(int n) {
  2. if (n <= 1) {
  3. return 1;
  4. }
  5. return sum(n - 1) + n;
  6. }

递归的特点

实际上,递归有两个显著的特征,终止条件和自身调用:

  • 自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
  • 终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。

递归解题思路

解决递归问题一般就三步曲,分别是:

  • 第一步,定义函数功能
  • 第二步,寻找递归终止条件
  • 第二步,递推函数的等价关系式

这个递归解题三板斧理解起来有点抽象,我们拿阶乘递归例子来喵喵吧~

  1. package com.example.interview.augom;
  2. //递归算法学习
  3. public class test1 {
  4. public static void main(String[] args) {
  5. //斐波那契数列
  6. int i = 1;
  7. for (i = 1; i <= 20; i++) {
  8. System.out.println("兔子第" + i + "个月的总数为:" + f(i));
  9. }
  10. //1……到100的和
  11. System.out.println(new test1().num100(10));
  12. //阶乘
  13. System.out.println(new test1().fact(3));
  14. }
  15. public int numT(int i) {
  16. System.out.print(i);
  17. i--;
  18. //结束条件
  19. if (i <= 0) {
  20. return 0;
  21. }
  22. return numT(i);
  23. }
  24. //1……100
  25. public int num100(int i) {
  26. if (i == 1) {
  27. return 1;
  28. } else
  29. return i + num100(i - 1);
  30. }
  31. //斐波那契数列
  32. public static int f(int x) {
  33. //条件
  34. if (x == 1 || x == 2) {
  35. return 1;
  36. } else
  37. //递归满足的函数是这个
  38. return f(x - 1) + f(x - 2);
  39. }
  40. //阶乘
  41. public int fact(int i) {
  42. if (i == 1) {
  43. return 1;
  44. } else {
  45. return i * fact(i - 1);
  46. }
  47. }
  48. }