求取斐波那契数列第N位的值。
    斐波那契数列:每一位的值等于他前两位数字之和。前两位固定 0,1,1,2,3,5,8。。。。
    解法一:暴力递归image.png

    1. public static int calculate(int num) {
    2. if (num == 0) {
    3. return 0;
    4. }
    5. if (num == 1) {
    6. return 1;
    7. }
    8. return calculate(num - 1) + calculate(num - 2);
    9. }

    解法二:去重递归
    递归得出具体数值之后、存储到一个集合(下标与数列下标一致),后面递归之前先到该集合查询一次,
    如果查到则无需递归、直接取值。查不到再进行递归计算image.png

    1. public static int calculate2(int num) {
    2. int[] arr = new int[num + 1];
    3. return recurse(arr, num);
    4. }
    5. private static int recurse(int[] arr, int num) {
    6. if (num == 0) {
    7. return 0;
    8. }
    9. if (num == 1) {
    10. return 1;
    11. }
    12. if (arr[num] != 0) {
    13. return arr[num];
    14. }
    15. arr[num] = recurse(arr, num - 1) + recurse(arr, num - 2);
    16. return arr[num];
    17. }

    解法三:双指针迭代
    基于去重递归优化,集合没有必要保存每一个下标值,只需保存前两位即可,向后遍历,得出N的值image.png

    1. public static int iterate(int num) {
    2. if (num == 0) {
    3. return 0;
    4. }
    5. if (num == 1) {
    6. return 1;
    7. }
    8. int low = 0;
    9. int high = 1;
    10. for (int i = 2; i <= num; i++) {
    11. int sum = low + high;
    12. low = high;
    13. high = sum;
    14. }
    15. return high;
    16. }