算法-1.1

1, 表达式的值:2.0e–6 * 1 0000 0000.1

200.0000 002

2, 1 + 2 + “3”

33 string

3, 从命令行输入三个整数,相等返回equal 否则返回not equal

public class threeParEqual
{
    public static void main(String[] args)
    {
        
        double a = Double.parseDouble(args[0]);
        double b = Double.parseDouble(args[1]);
        double c = Double.parseDouble(args[2]);
        if (a==b&&b==c)
        {
            System.out.println("equal");
        }
        else System.out.println("not equal");
    }
}

8, System.out.println(‘b’+ ‘c’); System.out.println((char)(‘a’ + 4));

197//Java中涉及byte,short和char类型的运算操作首先会把这些值转换为int类型,然后进行运算。

9, 将一个正整数N用二进制表示并转换为一个String类型的值s。

String s = “”;
forint n = N; n > 0; n /= 2)
    s = (n % 2) +s;


15, 编写一个静态方法histogram(),接受一个整型数组a[] 和一个整数M为参数并返回一个大小为M的数组,其中第i个元素的值为整数i在参数数组中出现的次数。如果a[]中的值均在0到M-1之间,返回数组中的所有元素之和应该和a.length相等。

 

public class Excise
{
    public static void main(String[] args)
    {
        int N = 30;
        int M = 10;
        
        int[] a = new int[N];
        for (int i = 0; i< N;i++)
            a[i] = (int)(Math.random()*M);
    
        for (int i=0; i< N; i++)
            System.out.println(a[i]);
        int[] h = histogram(a,M);
        
        System.out.println("\n");
        for (int i = 0; i< M;i++)
            System.out.println(h[i]);
    }
    
    public static int[] histogram(int[] a, int M)
    {
        int[] h = new int[M];
        int N = a.length;
        
        for (int i = 0; i<N; i++)
            if (a[i] < M)
                h[a[i]]++;
        return h;
    }
}

19,在计算机上运行以下程序:

 

public class Fibonacci
{
    public static void main(String[] args)
    {
        for (int N = 0; N < 100; N++)
            System.out.println(N+ " "+F(N));
    }
    public static long F(int N)
    {
        if (N == 0) return 0;
        if (N == 1) return 1;
        return  F(N-1) + F(N-2);
    }
}

开发F(N)一个更好的实现,用数组保存已经计算过的值。

public class Excise
{
    public static void main(String[] args)
    {
        for (int N = 0; N < 100; N++)
            System.out.println(N+ " "+Fib(N));
    }
    public static long Fib(int N)
    {
        long[] f = new long[N+1];
        return Fib(N, f);
    }
    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];
    }
}

使用数组 速度明显快很多。

WHY? 关键字:递归,数组是连续存储

同样问题http://segmentfault.com/q/1010000003012206

问题1:慢下来是因为处理的数据太大了,而且每次都要再次计算?还是因为其他什么原因?

问题1就是保存了中间结果。


 

问题2:题目中要预测计算机在一小时内能够得到F(N)结果的最大N值,这个怎么做?

问题2我也不肯定,我猜这个运算时间也是斐波那契数列。

 

问题3:
很好奇为什么这么快,自己尝试分析下,用N=0,1,2,3试,但是在Fib函数中为什么要if (f[N] == 0)呢?数组最后一个元素为0?
是因为用数组 f 保存已经计算过的值了,所以不需要再重新计算了所以才快了很多吗?

问题3的f(N)==0是用来判断这个值有没有计算过的,计算过直接调用已保存的结果,没计算过的f(N)是0,就进行if立面的计算。


问题4:
最后结果从93行开始,93,95,96,97,99行出现的负数,大致知道是和操作系统运算有关,但又不是很清楚,求解释?

问题4是long长度越界了

 

浅谈尾递归的优化方式http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html

20,编写一个递归的静态方法计算ln(N!)的值

 

posted @ 2015-10-02 15:52  yhidr  阅读(240)  评论(0编辑  收藏  举报