编程珠玑第四章习题答案

主要内容来自于互联网,自己做了一定的修改

1.为了保证范围不超过范围,我们需要在初始化的时候,让变量不超出范围。这样每次循环得到的新的范围是慢慢缩小的,不会越界。

2 返回t在数组x中第一次出现的位置。有可能t在数组中出现多次

#include<iostream>
using namespace std;
bool IsInvalidInput=false;
int BinarySearch(int a[],int length,int start,int end,int k)
{
if(a==NULL||length<0||start>length-1||end>length-1||start<0||end<0||start>end)
{
IsInvalidInput=true;
return -1;
}
while(start+1<end)
{
int middle=start+(end-start)/2;
if(a[middle]<k)
start=middle;//注意这里不能够写为middle+1形式,这样写的话计算数字在数组中第一次出现的位                                                 //置的话会出现错误
else
end=middle;
}
if(a[end]!=k)
return -1;
else
return end;
}
int main ()
{
int a[]={1,2,3,4,5,6,6,6,8,9};
int length=sizeof(a)/sizeof(int);
int k=6;
int result=BinarySearch(a,length,0,length-1,k);
if(IsInvalidInput)
cout<<"Input is Invalid"<<endl;
else
{
if(result==-1)
cout<<"can't find"<<endl;
else
cout<<result<<endl;
}
return 0;
}

3 递归法写二分搜索

int BinarySearch_recurse(int *data,int length,int start,int end,int k) //递归实现二分查找(折半搜索)
{
if(data==NULL||length<0)
{
IsInvalidInput=true;
return -1;
}
if(start<=end)
{
int middle=start+(end-start)/2;
if(data[middle]<k)
BinarySearch_recurse(data,length,middle+1,end,k);
else if(data[middle]>k)
BinarySearch_recurse(data,length,start,middle-1,k);
else
return middle;
}
else
return -1;
}

4.以下是所做测试查找范围和循环的次数的关系,很明显,当查找范围是指数级的时候,循环次数是线性的。

1	1
2	2
4	3
8	4
16	5
32	6
64	7
128	8
256	9
512	10
1024	11
2048	12
4096	13
8192	14
16384	15
32768	15
65536	17
131072	15
262144	18
524288	19
6

对于咖啡罐中豆子的两种操作,不论是哪一种都会使得罐中的豆子减少1粒,所以该过程能够终止。我们每一步都从咖啡罐中拿掉0个或者是2个白豆,所以白豆的个数的奇偶性保持不变。因此,当且仅当罐中最初的白豆个数为奇数时,最后留下的豆子才可能是白色的。

7

根据yi<yi+1,则当x=0时,bi<bi+1。那么可以将实数对根据bi的大小排序。排序过后就是(a1,b1),(a2,b2)……而根据题意其对应于x在【0,1】范围内的值Yi<Yi+1,所以这就相当于把线段从小到大排序了。这里根据bi来进行二分查找。首先选取中间的线,看点在他上面还是下面,然后可以缩小一半的查找范围。
9

(1)两个n维的向量相加。初开始时:i=0表示前i个维度的都已经计算好了。在循环之中,计算一个维度,然后i加一,计算下一个维度,每个循环结束表明前i个维度已经计算完毕。i一直在增大,证明这个过程是可以终止的。当最后一个循环执行完毕的时候,i的值是n,表明前n个维度已经计算好了。所以其代码是正确的。

(2)求x数组的最大值。初开始时候,max=x[0]表示最大值是第一个数,i=1表示前i个数的最大值已经求出。每次循环时候,如果有比max大的数,就替换,当循环结束时候,前i个数的最大值就知道了。当整个过程结束时,i==n,所以前n个数的最大值可以求出。

(3)当循环找个一个t的时候,就停止循环,或者当i超出范围的时候停止。i在每一次循环的时候值都增加,所以这个算法是可以结束的。当超出范围的时候,返回-1,否则返回的就是第一次出现的位置,因为i的值是从小到大递增的。

(4)每次递归,问题的规模都是缩小的,所以问题可以在有限步骤内结束。每次递归完成一次,就可以得到上次层想要的运算结果,接着向上传递。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值