java判断数组是否有序
编写具有如下函数原型的递归与非递归两种函数f,负责判断数组a的前n个元素是否从大到小完全有序了,是则返回true,否则返回false。并编制主函数对它们进行调用,以验证其正确性。
bool f(int a[], int n);
提示:
(1)非递归函数中只需逐对地判断各a[i]与a[i+1]是否都已从大到小有序排列(i = 0,1,…,n-2)。
(2)递归函数中将问题分解处理为:若n=1(即只有1个元素时)则返回true而递归出口;n>1时,若最后一对元素不顺序则返回false,否则进行递归调用(传去实参a与 n-1,去判断前n-1个元素的顺序性),并返回递归调用的结果(与前n-1个元素的是否顺序性相同)。
6.2概要设计:
本程设计思路: 总的来说并不难。关键就在于递归以及非递归算法是怎么写的。非递归就是将数组里的数一个一个一次比较就行了。递归则是用到循环调用。出错的处理则是交给java中的try,catch语句。
程序流程图(如左图):
6.3 详细设计与编码:
见上传程序。
6.4 调试分析:
在调试过程中基本是没有遇到什么大的问题,开始时在写递归算法的时候没有用一个布尔变量来控制,老是出错,说是没有返回值。而在错误的检测上,吸取以前的教训,我就不在细细分为什么输入负数、字符等的错误检测了,统一对输入的所有错误进行检测。
程序执行的结果:
错误检测
6.5 用户使用说明:
用户根据程序的提示输入数组,以及想要使用的判断方法,程序就会自己计算出所需的得数。如果有错误的话,程序会提出警示。
6.6 设计心得:
对于这次的实验感触最大的就是有些东西不懂还是老老实实的不用的好,像是错误的检测,现在不分了,反而是能检测出负数、字符的错误了,细分的话还是出不来结果。然后就是感觉java的输入流也是有很多自己不会不懂的。这个实验在输入数组的时候一定是要用回车来分隔的,所以在输入数组的时候看起来会是相当的变扭,之后知道了还有一种更好的办法,能实现空格键来分隔的,不过也就没有再去改成那种的了。
/**
编写具有如下函数原型的递归与非递归两种函数f,负责判断数组a的前n个元素是否从大到小完全有序了,是则返回true,
否则返回false。并编制主函数对它们进行调用,以验证其正确性。
bool f(int a[], int n);
提示:
(1)非递归函数中只需逐对地判断各a[i]与a[i+1]是否都已从大到小有序排列(i = 0,1,…,n-2)。
(2)递归函数中将问题分解处理为:若n=1(即只有1个元素时)则返回true而递归出口;
n>1时,若最后一对元素不顺序则返回false,
否则进行递归调用(传去实参a与 n-1,去判断前n-1个元素的顺序性),
并返回递归调用的结果(与前n-1个元素的是否顺序性相同)。
*/
import java.io.*;
public class shisi {
static String printArray(int[]a)//输出数组的方法
{
String result=" ";
for(int i=0;i<a.length;i++) result+=a[i]+" ";
return result;
}
static boolean f1(int a[],int n){//非递归的方法,两个两个判断,如果有后面的大于前面的就返回false
int i;
for(i=0;i<n-1;i++)
if(a[i]<a[i+1])
return false;
return true;
}
static boolean f2(int b[],int m){//递归的方法
boolean f;//用于标志
if(m==1) //如果就检查一位,就返回true
f=true;
else if(b[m-2]<b[m-1])//然后检查b[m-2]和b[m-1]
f=false;
else f=f2(b,m-1);//如果b[m-2]>b[m-1]则递归看下一组
return f;
}
public static void main(String args[])throws IOException{
try{
boolean x;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
原文请找腾讯752018766优,文-论'文.网http://www.youerw.com System.out.println("请检查的位数:");
System.out.flush();
int n=Integer.parseInt(br.readLine());
System.out.println("请选择检查的方法:1、非递归 2、递归");
System.out.flush();
int n1=Integer.parseInt(br.readLine());
System.out.println("队列:"+printArray(a));
if(n1==1){
x=f1(a,n);
if(x) System.out.println("非递归判断:从大到小排列有序");
else System.out.println("非递归判断:不是从大到小排列有序");
}
if(n1==2){
x=f2(a,n);
if(x) System.out.println("递归判断:从大到小排列有序");
else System.out.println("递归判断:不是从大到小排列有序");
}
}catch(Exception e){
System.out.println("输入有错!");1837