一道简单递归程序设计的题目(最好用java来描述)
一个序列可以认为是一个数组{a,b,c,d,e,f},要求以递归的方式生成一个序列{abacadaeafbcbdbebfcdcecfdedf}...
一个序列 可以认为是一个数组 {a,b,c,d,e,f},
要求以递归的方式生成一个序列{ab ac ad ae af bc bd be bf cd ce cf de df} 展开
要求以递归的方式生成一个序列{ab ac ad ae af bc bd be bf cd ce cf de df} 展开
3个回答
展开全部
public class DiGui {
public static void main(String[] args) {
String[] s ={"a","b","c","d","e","f"};
List<String> list = new ArrayList<String>();
DiGui dg = new DiGui();
list = dg.aa(s, 0, list);
Iterator<String> it = list.iterator();
while(it.hasNext()){
String a = it.next();
System.out.print(a+" ");
}
}
public List<String> aa(String[] s,int k,List<String> list){
int len = s.length;
if(len-k-1<=1){
if(len == 1){
list.add(s[0]);
return list;
}else if(len <= 0){
list.add("你传入的字符数组是空数组!");
}else{
list.add(s[k]+s[k+1]);
return list;
}
}else{
for(int i=0;i<len-k-1;i++){
list.add(s[k]+s[k+i+1]);
}
aa(s,k+1,list);
}
return list;
}
}
自己在eclipse里给你敲的。楼上的答非所谓,别人是要递归的,你来个双重循环的答案。
根据你提供的资料,所以用的是字符数组,当然其他数组也行的,只是修改下方法体就好了。
至于aa(String[] s,int k,List<String> list)的参数给你讲一下,数组s就是你要进行递归的数组,k默认传入0表示进行第一次递归,k+1就应该能明白了吧,list用来存放中间生成的数据。其他的就没什么好说的了,相信应该能看懂的。
递归方法主要就是这个aa()方法,那个main方法里的是测试用的。这个递归的依据是,从一个字符数组的第一个(index)元素开始,依次与后面的元素合并,然后index+1的元素再依次与后面的元素合并,依次类推直到倒数第二个元素,因为最后一个元素的后面已经没有元素了,那么它就不再进行递归了,也就是说当递归到倒数第二个元素的时候,就递归结束,这也是递归的结束条件。所以在aa()一定会有一个if...else进行结束条件的判断,这里的if(len-k-1<=1)里就是递归结束的返回判断,如果你觉得看起或者理解不方便可以写成这样if(len-k<=2),k是用来标识当前进行递归的元素的位置,所以每次递归后都会进行k+1,所以当len-k<=2时表示当前进行递归的位置已经是递归结束的标志了,这里特别注意的是为什么if里还有两个if...else,假如你传的数组只有一个元素或者是空数组,那么也要进行相应的处理。那么对递归的结束条件进行了正确的判定后,就是递归的主体了,这里的主体就在第一个if...else的else里。可以看到for循环是在对s[k]位置的元素依次与后面的元素进行合并,然后存入一个list里保存,当对k位置的元素合并完了后,是不是该再对k+1位置的进行合并了呢。你会发现对k+1位置的元素与后面元素合并的过程与k位置的是一模一样,那么是不是再调用一次方法自身来实现是不是就很省事了,所以for循环结束完了,就调用方法aa(s,k+1,list),这样s[k]的下一个元素s[k+1]不就自己处理完成了吗,然后在aa(s,k+1,list)里,如果满足不了递归结束条件,那么aa()就会一直调用下去知道满足条件停止递归。
public static void main(String[] args) {
String[] s ={"a","b","c","d","e","f"};
List<String> list = new ArrayList<String>();
DiGui dg = new DiGui();
list = dg.aa(s, 0, list);
Iterator<String> it = list.iterator();
while(it.hasNext()){
String a = it.next();
System.out.print(a+" ");
}
}
public List<String> aa(String[] s,int k,List<String> list){
int len = s.length;
if(len-k-1<=1){
if(len == 1){
list.add(s[0]);
return list;
}else if(len <= 0){
list.add("你传入的字符数组是空数组!");
}else{
list.add(s[k]+s[k+1]);
return list;
}
}else{
for(int i=0;i<len-k-1;i++){
list.add(s[k]+s[k+i+1]);
}
aa(s,k+1,list);
}
return list;
}
}
自己在eclipse里给你敲的。楼上的答非所谓,别人是要递归的,你来个双重循环的答案。
根据你提供的资料,所以用的是字符数组,当然其他数组也行的,只是修改下方法体就好了。
至于aa(String[] s,int k,List<String> list)的参数给你讲一下,数组s就是你要进行递归的数组,k默认传入0表示进行第一次递归,k+1就应该能明白了吧,list用来存放中间生成的数据。其他的就没什么好说的了,相信应该能看懂的。
递归方法主要就是这个aa()方法,那个main方法里的是测试用的。这个递归的依据是,从一个字符数组的第一个(index)元素开始,依次与后面的元素合并,然后index+1的元素再依次与后面的元素合并,依次类推直到倒数第二个元素,因为最后一个元素的后面已经没有元素了,那么它就不再进行递归了,也就是说当递归到倒数第二个元素的时候,就递归结束,这也是递归的结束条件。所以在aa()一定会有一个if...else进行结束条件的判断,这里的if(len-k-1<=1)里就是递归结束的返回判断,如果你觉得看起或者理解不方便可以写成这样if(len-k<=2),k是用来标识当前进行递归的元素的位置,所以每次递归后都会进行k+1,所以当len-k<=2时表示当前进行递归的位置已经是递归结束的标志了,这里特别注意的是为什么if里还有两个if...else,假如你传的数组只有一个元素或者是空数组,那么也要进行相应的处理。那么对递归的结束条件进行了正确的判定后,就是递归的主体了,这里的主体就在第一个if...else的else里。可以看到for循环是在对s[k]位置的元素依次与后面的元素进行合并,然后存入一个list里保存,当对k位置的元素合并完了后,是不是该再对k+1位置的进行合并了呢。你会发现对k+1位置的元素与后面元素合并的过程与k位置的是一模一样,那么是不是再调用一次方法自身来实现是不是就很省事了,所以for循环结束完了,就调用方法aa(s,k+1,list),这样s[k]的下一个元素s[k+1]不就自己处理完成了吗,然后在aa(s,k+1,list)里,如果满足不了递归结束条件,那么aa()就会一直调用下去知道满足条件停止递归。
展开全部
public class for1{
public static void main(String[]args){
int[] aaa = new int[6];//建立的这个数组就相当于你的{a,b,c,d,e,f}
for(int i=0;i<aaa.length;i++){
for(int x=0;x<aaa.length-i-1;x++){
System.out.println("aaa["+(i)+"]*aaa["+(i+x+1)+"]"+aaa[i]*aaa[i+x+1]);//这里输出的就是你要的
}//结果{ab ac ad ae af bc bd be bf cd ce cf de df}呵呵 不过你好象少写了一个“ef”
}
}
}
// 希望 你能看懂我写的代码。。。。
public static void main(String[]args){
int[] aaa = new int[6];//建立的这个数组就相当于你的{a,b,c,d,e,f}
for(int i=0;i<aaa.length;i++){
for(int x=0;x<aaa.length-i-1;x++){
System.out.println("aaa["+(i)+"]*aaa["+(i+x+1)+"]"+aaa[i]*aaa[i+x+1]);//这里输出的就是你要的
}//结果{ab ac ad ae af bc bd be bf cd ce cf de df}呵呵 不过你好象少写了一个“ef”
}
}
}
// 希望 你能看懂我写的代码。。。。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你少个 ef
public class Test {
private String[] strs;
public String[] getStrs() {
return strs;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public Test(String[] strs) {
super();
this.strs = strs;
}
public String[] getNewArrays(int index,StringBuffer str){
if(index<strs.length){
for(int i=index;i<strs.length;i++){
if(i!=index){
str.append(strs[index]).append(strs[i]).append(",");
}
}
index++;
getNewArrays(index,str);
}
return str.toString().substring(0,str.toString().lastIndexOf(",")).split(",");
}
public static void main(String[] args) {
Test t = new Test(new String[]{"a","b","c","d","e"});
String[] strs = t.getNewArrays(0, new StringBuffer());
for(String str : strs){
System.out.println(str);
}
}
}
public class Test {
private String[] strs;
public String[] getStrs() {
return strs;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public Test(String[] strs) {
super();
this.strs = strs;
}
public String[] getNewArrays(int index,StringBuffer str){
if(index<strs.length){
for(int i=index;i<strs.length;i++){
if(i!=index){
str.append(strs[index]).append(strs[i]).append(",");
}
}
index++;
getNewArrays(index,str);
}
return str.toString().substring(0,str.toString().lastIndexOf(",")).split(",");
}
public static void main(String[] args) {
Test t = new Test(new String[]{"a","b","c","d","e"});
String[] strs = t.getNewArrays(0, new StringBuffer());
for(String str : strs){
System.out.println(str);
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询