《算法》Ex_1.1

不知道是我太笨还是《算法》的作者脑洞大开,在第一章就看到了好多很妙的函数

1.之前看到的斐波那契数列都是递推给出的

f[n]=f[n-1]+f[n-2];

这次看到了一个代码还是挺有趣的

int f=0;//保存当前数
int g=0;//保存前一个数
forint i=0;i<=15;i++)
{
    printf("%d",f);
    f=f+g;
    g=f-g;
}

2.递归计算fibonacci数列

    public static long Fib(int N)
    {
        long[]f=new long[N+1];
        return fib(f,N);
    }

    public static long fib(long[]f,int N)
    {
        if(N==1)f[N]=1;
        else if (N==2)f[N]=1;
        else if (N>2) {
            f[N]=fib(f,N-1)+fib(f,N-2);
        }
        return f[N];
    }

     public static long Fib(int N, long[] f)
    {
        if (f[N] == 0)
        {
            if (N == 1)
                f[N] = 1;
            else if (N > 1)
                f[N] = Fib(N-1, f) + Fib(N-2, f);
        }
        return f[N];
    }

    public static void main(String[]args)
    {
        for(int N=0;N<100;N++)
            StdOut.println(N+" "+Fib(N));
    }

两个函数fib/Fib几乎一样,但是第一个效率很低,在N=42之后就很慢很慢,第二个函数效率就很高

编写递归代码时:
要有一个最简单的情况——方法的第一条总是包含return语句;
解决的是规模更小的子问题,这样才能收敛;
父问题和子问题不能有交集;

违反任意一条都可能低效或者出错,例如上面的fib函数,在求f[N]=fib(f,N-1)+fib(f,N-2)实际就说明所求子问题和父问题有交集,导致递归深度越来越大,结果就是越来越慢,但是Fib函数把父问题所求结果放在数组里,子问题求解可以直接使用,不存在交集的情况,因此效率很高。

3.计算a*b和a^b

public static int mystery(int a,int b)
        {
            if(b==0)return 1;//if 1--->0
            if(b%2==0)return mystery(a*a,b/2);//if *---> +
            return mystery(a*a,b/2)*a;//if *---> +
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值