编写一个静态方法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));
}
}