算法1.1.15/16/18/19题

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

class Ex_1_1_15
{
    public static int[] histogram(int[] a,int M)
    {
        int[] h = new int[M];
        int N = a.length;
        for(int i=0;i<N;i++)
        {
            h[a[i]]++;
        }
        return h;
    }
    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]=StdRandom.uniform(M);
        }
        for(int i=0;i<N;i++)
        {
            StdOut.printf("%2d",a[i]);
        }
        int[] h= histogram(a,M);
        StdOut.println("\n");

        for(int i=0;i<M;i++)
        {
            StdOut.printf("%4d",h[i]);
        }
     }
 }

给出exR1(6) 的返回值:
public static String exR1(int n)
{
if (n <= 0) return “”;
return exR1(n-3) + n + exR1(n-2) + n;
}

class Ex_1_1_16
{
    public static String exR1(int n)
    {
        if(n<=0)return "";
        return exR1(n-3)+n+exR1(n-2)+n;
    }
    public static void main(String[] args)
    {
        StdOut.println(exR1(4));
    }
}

1.1.18 请看以下递归函数:
public static int mystery(int a, int b)
{
if (b == 0) return 0;
if (b % 2 == 0) return mystery(a+a, b/2);
return mystery(a+a, b/2) + a;
}
mystery(2, 25) 和mystery(3, 11) 的返回值是多少?给定正整数a 和b,mystery(a,b)
计算的结果是什么?将代码中的+ 替换为* 并将return 0 改为return 1,然后回答相同
的问题。

class Ex_1_1_18
{
    public static int mystery(int a,int b)
    {
        if(b==0)return 0;
        if(b%2==0)return mystery(a+a,b/2);
        return mystery(a+a,b/2)+a;
    }
    public static void main(String[] args)
    {
      /*  StdOut.println(mystery(2,25));
        StdOut.println(mystery(3,11));*/
        int a= Integer.parseInt(args[0]);
        int b= Integer.parseInt(args[1]);
        StdOut.println(mystery(a,b));

    }
}

19public class Fibonacci
{
public static long F(int N)
{
if (N == 0) return 0;
if (N == 1) return 1;
return F(N-1) + F(N-2);
}
public static void main(String[] args)
{
for (int N = 0; N < 100; N++)
StdOut.println(N + ” ” + F(N));
}
}
计算机用这段程序在一个小时之内能够得到F(N) 结果的最大N 值是多少?开发F(N) 的一
个更好的实现,用数组保存已经计算过的值。

public class Ex_1_1_19
{
    public static long F(int N)
    {
        if (N == 0) return 0;
        if (N == 1) return 1;
        return F(N-1) + F(N-2);
    }

    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];
    }

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

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值