1-6 什么是算法?算法的5个特性是什么?试根据这些特性解释算法与程序的区别。

Algorithm,算法的定义为一个有穷的指令集,这些指令集为解决某一特定任务规定了一个运算序列。一个算法应当具有以下5个特性:
1.输入
2.输出
3.确定性
4.有穷性
5.有效性
算法与程序不同,程序不满足上述特性4.


1-7 试编写一个函数计算n!×2^n的值,结果存放于数组A[arraySize]的第n个数组元素中,0<=n<=arraySize.若设计算机中允许的整数最大值为maxInt,则当n>arraySize或者对于某一个k(0<=k<=n),使得k!*2^k>maxInt时,应按出错处理。可有如下三种不同的出错处理方式:
(1)用cerr << 及exit(1)语句来终止执行并报告错误;
(2)用返回整数函数值0,1来实现算法,以区别是正常返回还是错误返回;
(3)在函数的参数表设置一个引用型的整型变量来区别是正常返回还是某种错误返回。 试讨论这三种方法各自的优缺点,并以你认为是最好的方式实现它。


(1)函数直观易懂,表示简洁;

const int maxInt=某一个整数
const int arraySize=某一个整数
int calculate(int n){ //函数主体
if(!0<=n<=arraySize) { //如果n超出范围,出错返回
cerr << "n is out of the range!" << endl; exit(1);
}
int *A=new int[n]; //A[n]
A[0]=1;
for(i=1;i<=n;i++){
A[i]=A[i-1]*i*2;
if(A[i]>=maxInt){ //如果某个k!*2^k>maxInt出错返回
cerr << "n is out of the range!" << endl; exit(1);
}
return A[n]; //返回函数计算结果
}

(2)通过函数返回0或者1来判断函数运行的结果,但是函数的运算结果需要另外查找A[arraySize]数组的结果。

const int maxInt=某一个整数
const int arraySize=某一个整数
int calculate(int n){ //函数主体
if(!0<=n<=arraySize) //如果n超出范围,出错返回
return 0;
int *A=new int[n]; //A[n]
A[0]=1;
for(i=1;i<=n;i++){
A[i]=A[i-1]*i*2;
if(A[i]>=maxInt) //如果某个k!*2^k>maxInt出错返回
return 0;
return 1; //返回函数计算结果
}

(3)函数是否运行成功,不能从函数本身得到结果,需要另外考查ret变量,如果变量在函数运行後依然是1,则运行成功,反之失败。函数直接返回运算结果。

const int maxInt=某一个整数
const int arraySize=某一个整数
int ret=1; //函数return状态,0错误,1正常
int calculate(int n,int& ret){ //函数主体
if(!0<=n<=arraySize){ //如果n超出范围,出错返回
ret=0;
return;
}
int *A=new int[n]; //A[n]
A[0]=1;
for(i=1;i<=n;i++){
A[i]=A[i-1]*i*2;
if(A[i]>=maxInt){ //如果某个k!*2^k>maxInt出错返回
ret=0;
return;
}
return A[n]; //返回函数计算结果
}

Comments (0)