斐波那契 和 阶乘

1 斐波那契的 递归算法. (递归用的是 分治 的思想)

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

斐波那契的 迭代(非递归)算法. (迭代用的是 动规 的思想)

 public static int Fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        int last2 = 1;    // 第i-2项
        int last1 = 1;    // 第i-1项
        int cur = 0;      // 当前项
        while (n > 2) {
            cur = last1 + last2;     // 每次循环都要更新 前一项与前两项的值
            last2 = last1;
            last1 = cur;
            n--;
        }
        return cur;
    }

递归和迭代.
(1) 迭代: 利用变量的 原值 推算出变量的一个 新值.
如果 递归 是自己调用自己的话, 迭代 就是A不停的调用B.

(2) 递归 中一定有迭代, 但是 迭代 中不一定有递归, 大部分可以相互转换.

能用迭代的不用递归. 递归调用函数 浪费空间, 并且递归太深容易造成堆栈的 溢出.

2 阶乘的递归.

 public static int Fac1(int num) {
        if (num < = 2) {
            return num;
        }
        return num * Fac1(num - 1);
    }

阶乘的非递归.

  public static int Fac(int num) {
        int k = 1;
        while (num > 0) {
            k *= num;
            num--;
        }
        return k;
    }

3 错排算法. 错排问题: 有n个正整数1,2,3,…n, 将这n个正整数重新排列, 使其中的 每一个数都不在 原来的位置上.

public static float count(int n) {
        if (n == 1) {
            return 0;
        } else if (n == 2) {
            return 1;
        } else {
            return (n - 1) *  (count(n - 1) + count(n - 2));
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值