算法 第四版 习题 答案.doc

上传人:苏美尔 文档编号:5657450 上传时间:2020-07-20 格式:DOC 页数:25 大小:146.50KB
返回 下载 相关 举报
算法 第四版 习题 答案.doc_第1页
第1页 / 共25页
算法 第四版 习题 答案.doc_第2页
第2页 / 共25页
算法 第四版 习题 答案.doc_第3页
第3页 / 共25页
算法 第四版 习题 答案.doc_第4页
第4页 / 共25页
算法 第四版 习题 答案.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《算法 第四版 习题 答案.doc》由会员分享,可在线阅读,更多相关《算法 第四版 习题 答案.doc(25页珍藏版)》请在三一文库上搜索。

1、1.1.1 给出以下表达式的值:a. ( 0 + 15 ) / 2b. 2.0e-6 * 100000000.1c. true & false | true & true答案:a.7,b.200.0000002 c.ture1.1.2 给出以下表达式的类型和值:a. (1 + 2.236)/2b. 1 + 2 + 3 + 4.0c. 4.1 = 4d. 1 + 2 + 3答案:a.1.618 b. 10.0 c.true d.331.1.3 编写一个程序,从命令行得到三个整数参数。如果它们都相等则打印equal,否则打印not equal。public class TestUqual publ

2、ic static void main(String args)int a,b,c;a=b=c=0;StdOut.println(Please enter three numbers); a =StdIn.readInt(); b=StdIn.readInt(); c=StdIn.readInt();if(equals(a,b,c)=1)StdOut.print(equal);elseStdOut.print(not equal);public static int equals(int a ,int b , int c)if(a=b&b=c)return 1;elsereturn 0;1.1

3、.4下列语句各有什么问题(如果有的话)?a. if (a b) then c = 0;b. if a b c = 0; c. if (a b) c = 0;d. if (a b) c = 0 else b = 0;答案:a. if (a b) c = 0; b. if (a b) c = 0; 1.1.5 编写一段程序,如果double 类型的变量x 和y 都严格位于0 和1 之间则打印true,否则打印false。public class TestUqual public static void main(String args)double x;double y;x=StdIn.readD

4、ouble();y=StdIn.readDouble();StdOut.print(compare(x)& compare(y);public static boolean compare(double x)If(x0&x1)returen ture;else return false;1.1.6 下面这段程序会打印出什么?int f = 0;int g = 1;for (int i = 0; i .001)t = (9.0/t + t) / 2.0;StdOut.printf(%.5fn, t);b. int sum = 0;for (int i = 1; i 1000; i+)for (i

5、nt j = 0; j i; j+)sum+;StdOut.println(sum);c. int sum = 0;for (int i = 1; i 1000; i *= 2)for (int j = 0; j 0; n /= 2)s = (n % 2) + s;1.1.10 下面这段代码有什么问题?int a;for (int i = 0; i 10; i+)ai = i * i;解答:它没有用new 为a 分配内存。这段代码会产生一个variable a might not havebeen initialized 的编译错误。1.1.11 编写一段代码,打印出一个二维布尔数组的内容。其

6、中,使用* 表示真,空格表示假。打印出行号和列号。public class Test public Test() / TODO Auto-generated constructor stubpublic static void main(String args) / TODO Auto-generated method stubboolean a = new boolean1010;a=RandomInitial(a);/随机初始化TestPrint(a);/打印数组public static void TestPrint(boolean a)for(int i=0;ia.length;i+)

7、/打印行号StdOut.print( +i);StdOut.println( );for(int i=0;i10;i+)StdOut.print(i);for(int j=0;j10;j+)if(aij)StdOut.print(*+ );elseStdOut.print( + );StdOut.println( );public static boolean RandomInitial( boolean a)for(int i=0;ia.length;i+)for(int j=0;ja.length;j+)if(StdRandom.bernoulli(0.1)aij=true;elseaij

8、=false;return a;1.1.12 以下代码段会打印出什么结果?int a = new int10;for (int i = 0; i 10; i+)ai = 9 - i;for (int i = 0; i 10; i+)ai = aai;for (int i = 0; i 10; i+)System.out.println(i);答案:0 1 2 3 4 5 6 7 8 9如System.out.println(ai);0 1 2 3 4 4 3 2 1 01.1.13 编写一段代码,打印出一个M 行N 列的二维数组的转置(交换行和列)。public class Migrate p

9、ublic Migrate() / TODO Auto-generated constructor stubpublic static void main(String args) / TODO Auto-generated method stubint m=5;int n=5; int a=new int mn; int b=new int nm; a=RandomInitial(a,n); /初始化二维数组 b=MigrateArrays(a,b); /转置二维数组 MigratePrint(b);/输出转置二维数组 public static void MigratePrint(int

10、a)StdOut.println(输出转置二维数组:); for (int i=0;ia.length;i+) for(int j=0;ja0.length;j+) StdOut.print(aij+ ); StdOut.println(); public static int MigrateArrays(int a,int b) for (int i=0;ia.length;i+) for(int j=0;ja0.length;j+) bji=aij; return b;public static int RandomInitial(int a,int N)StdOut.println(初始

11、化二维数组:); for (int i=0;ia.length;i+) for(int j=0;j=M)N=N/M;a+;return a;1.1.15 编写一个静态方法histogram(),接受一个整型数组a 和一个整数M 为参数并返回一个大小为M的数组,其中第i个元素的值为整数i在参数数组中出现的次数。如果a中的值均在0到M-1之间,返回数组中所有元素之和应该和a.length 相等。public static int histogram(int a,int M)int b= new int M;int n=0;int m=0;for(int i=0;iM;i+)for(int j=0;

12、ja.length;j+)if(i=aj)n+;bi=n;n=0;for(int i=0;iM;i+)m=m+bi;return b;1.1.16 给出exR1(6) 的返回值:public static String exR1(int n)if (n = 0) return ;return exR1(n-3) + n + exR1(n-2) + n;答案:3113611422461.1.17 找出以下递归函数的问题:public static String exR2(int n)String s = exR2(n-3) + n + exR2(n-2) + n;if (n = 0) retur

13、n ;return s;答:这段代码中的基础情况永远不会被访问。调用exR2(3) 会产生调用exR2(0)、exR2(-3) 和exR2(-6),循环往复直到发生StackOverflowError。可以修改为:public static String exR2(int n)if (n = 0) return ;String s = exR2(n-3) + n + exR2(n-2) + n;return s;1.1.18 请看以下递归函数:public static int mystery(int a, int b)if (b = 0) return 0;if (b % 2 = 0) re

14、turn 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,然后回答相同的问题。答案:50,33. 225 3111.1.19 在计算机上运行以下程序:public class Fibonaccipublic static long F(int N)if (N = 0) return 0;if (N = 1) return 1;return F(

15、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 Fibonaccipublic 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 ma

16、in(String args)int a=new int 100;a=A(a);public static long A(int a)a0=0; a1=1;for (int N = 2; N 1)return Math.ln(N)+factorialln(N-1);elsereturn 0;1.1.21 编写一段程序,从标准输入按行读取数据,其中每行都包含一个名字和两个整数。然后用printf() 打印一张表格,每行的若干列数据包括名字、两个整数和第一个整数除以第二个整数的结果,精确到小数点后三位。可以用这种程序将棒球球手的击球命中率或者学生的考试分数制成表格。public class Sco

17、reTable public static void main(String args) String s = Lets go for lunch!;In in = new In(Se); String whitelist = in.readAllStrings();/将文件中的字符串读取到数组中 for(int i=0;iwhitelist.length;i=i+3) StdOut.print(whitelisti+ +whitelisti+1+ +whitelisti+2+ ); double m=Double.parseDouble(whitelisti+1); double n=Dou

18、ble.parseDouble(whitelisti+2); StdOut.printf(0.3%,m/n); StdOut.println( ); 1.1.22 使用1.1.6.4 节中的rank() 递归方法重新实现BinarySearch 并跟踪该方法的调用。每当该方法被调用时,打印出它的参数lo 和hi 并按照递归的深度缩进。提示:为递归方法添加一个参数来保存递归的深度。1.1.23 为BinarySearch 的测试用例添加一个参数:+ 打印出标准输入中不在白名单上的值;-,则打印出标准输入中在白名单上的值。public static int rank(int key, int a,

19、char c) int lo = 0; int hi = a.length - 1; if(c=+) while (lo = hi) / Key is in alo.hi or not present. int mid = lo + (hi - lo) / 2; if (key amid) lo = mid + 1; else return mid; return -1; if(c=-) while (lo = hi) / Key is in alo.hi or not present. int mid = lo + (hi - lo) / 2; if (key amid) lo = mid

20、+ 1; else return -1; return 0; else return -1; 1.1.24 给出使用欧几里德算法计算105 和24 的最大公约数的过程中得到的一系列p 和q 的值。扩展该算法中的代码得到一个程序Euclid,从命令行接受两个参数,计算它们的最大公约数并打印出每次调用递归方法时的两个参数。使用你的程序计算1 111 111 和1 234 567 的最大公约数。public static int CommomDivisor(int x,int y)if(x=1|y=1)StdOut.println(x=+x+y=+y);return 1;if(x b) t = a;

21、 a = b; b = t; if (a c) t = a; a = c; c = t; if (b c) t = b; b = c; c = t; 1.1.27 二项分布。估计用以下代码计算binomial(100, 50) 将会产生的递归调用次数:public static double binomial(int N, int k, double p)if (N = 0 & k = 0) return 1.0; and if (N 0 | k 0) return 0.0;return (1.0 - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1);

22、将已经计算过的值保存在数组中并给出一个更好的实现。估计递归调用次数: 100!public static double binomial(int N,int k,double p)cnt+;StdOut.println(N=+N+k=+k+p=+p);if (N = 0 & k = 0) StdOut.println(N = 0 & k = 0);return 1.0; if (N 0 | k 0) StdOut.println(N 0 | k 0); return 0; return (1.0 - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1,p)

23、;值保存在数组中的实现方法:public static void binomialArrays(int N,int K,double p)double a=new doubleN+1K+1;a00=1;for(int j=1;jN+1;j+)aj0=aj-10*(1-p);for (int i=0;iN+1;i+)for(int j=1;j=i&jK+1;j+)aij= (1-p)*ai-1j+p*ai-1j-1;思路: N列K行的数组:P(N,K)=(1-p)f(N-1,k)+p* f(N-1,K-1)f(N-1,K-1)f(N-1,k)f(N,K)1.1.28 删除重复元素。修改Binar

24、ySearch 类中的测试用例来删去排序之后白名单中的所有重复元素。public static int countC(int a)/排序后,统计重复数量 int cnt=0; for(int i=0;ia.length-1;i+) if(ai= ai+1) s+; return cnt; public static int remove(int a,int cnt ) int s=0; int b=new inta.length-cnt; b0=a0; for(int i=0;ia.length-1;i+) if(ai= ai+1) s+; else bi-s+1=ai+1; return b

25、; 1.1.29 等值键。为BinarySearch 类添加一个静态方法rank(),它接受一个键和一个整型有序数组(可能存在重复键)作为参数并返回数组中小于该键的元素数量,以及一个类似的方法count() 来返回数组中等于该键的元素的数量。注意:如果i 和j 分别是rank(key,a) 和count(key,a)的返回值,那么ai.i+j-1 就是数组中所有和key 相等的元素。import java.util.Arrays;public class BinarySearch2 public BinarySearch2() / TODO Auto-generated constructor

26、 stub/*返回小于key的元素数量 * */public static int rank(int key, int a) int lo = 0; int hi = a.length - 1; while (lo = hi) / Key is in alo.hi or not present. int mid = lo + (hi - lo) / 2; if (key amid) lo = mid + 1; else while(amid=amid-1&mid0) mid-; return mid; return-1; public static int count (int key, in

27、t a) int cnt=0;int i=rank(key,a);while(ai=ai+1&ia.length)cnt+;i+;return cnt;public static void main(String args) / TODO Auto-generated method stub In in = new In(tinyW); int whitelist = in.readAllInts(); Arrays.sort(whitelist); int key=StdIn.readInt(); int cnt=rank(key,whitelist); StdOut.println(sma

28、ller than +key+ element have +cnt ); int cntequal=count(key,whitelist); StdOut.println(equal +key+ element have +cntequal );1.1.30 数组练习。编写一段程序,创建一个NN 的布尔数组a。其中当i 和j 互质时(没有相同因子),aij 为true,否则为false。public static boolean TestArrays( boolean a)/int N=a.length;int M=a0.length;StdOut.println(M+=M+N=+N);fo

29、r(int i=0;iN;i+)for(int j=0;jM;j+)if(gcd(i,j)=1)aij=true;elseaij=false;return a;public static int gcd(int m,int n)if(m=0|n=0)return 1;if(m%n=0)return n;elsereturn gcd(n,m%n);1.1.31 随机连接。编写一段程序,从命令行接受一个整数N 和double 值p(0 到1 之间)作为参数,在一个圆上画出大小为0.05 且间距相等的N 个点,然后将每对点按照概率p 用灰线连接。public class RandomAccess p

30、ublic RandomAccess() / TODO Auto-generated constructor stubpublic static void drawcricle(double x,double y,double r,int N,double p,double a)StdDraw.setXscale(0, x*2);StdDraw.setYscale(0, y*2);StdDraw.setPenRadius(0.005);StdDraw.setPenColor(StdDraw.RED);StdDraw.circle(50, 50, 50);for(int i=0;iN;i+) S

31、tdDraw.setPenRadius(0.05); StdDraw.setPenColor(StdDraw.BLACK); double m=50-50*Math.cos(2*Math.PI*i/N); double n=50+50*Math.sin(2*Math.PI*i/N); StdDraw.point(m, n);ai0=m;ai1=n; StdDraw.setPenColor(StdDraw.RED);/StdDraw.text(m,n,i+ m=+m+ n=+n);public static void Randomline(double x,double y,double a)S

32、tdDraw.setXscale(0, x*2);StdDraw.setYscale(0, y*2); StdDraw.setPenRadius(0.01); StdDraw.setPenColor(StdDraw.LIGHT_GRAY); int N=a.length;for(int i=0;iN;i+)for(int j=0;jN;j+)if(StdRandom.bernoulli(0.5) StdDraw.line(ai0, ai1, aj0, aj1);public static void main(String args) double x=50;double y=50;double r=50;int N=10;double p=0.2;double a=new doubleN2;/画圆/描点drawcricle(x,y,r,N,p,a);/画线Randomline(x,y,a);1.1.32 直方图。假设标准输入流中含有一系列double 值。编写一段程序,从命令行接受一个整数N 和两个double 值l 和r。将(l,r) 分为N 段并使用StdDraw 画出输入流中的值落入每段的数量的直方图。public class histogram /*将(l,r) 分为N段 * */ public static double segmenta

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1