所以我在计算机算法类中有这个赋值: 编写递归算法,给定正整数n> = 1,打印全部 数字序列 k> = 1且1< = i1< i2< ...< ik< = n。 例如:如果n = 3,那么输出将是
1
1,2
1,2,3
1,3
2
2,3
3
我试图用Java编写这个赋值的递归代码,但我不知道如何处理这个问题。我理解递归的基础知识,但我自己编写递归代码时遇到了麻烦。
这就是我现在所拥有的:
public class question4
{
public static void main(String arg[]){
int x = 10;
printSequence(x);
}
public static int printSequence(int n){
if (n == 1){
System.out.println(n);
return n;
}
else{
int result = printSequence(n-1) + 1;
System.out.println(result);
return result;
}
}
}
它只打印1,2,3,4,5,6,7,8,9,10
请帮助我!
提前谢谢!
答案 0 :(得分:2)
基本上,以n = 5
为例,您应该打印两种间隔
1 | full interval
1 2 |
1 2 3 |
1 2 3 4 |
1 2 3 4 5 |
1 _ 3 4 5 | concatenation of full interval (1 -> i) with (i+1 -> n)
1 2 _ 4 5 |
1 2 3 _ 5 |
1 _ _ 4 5 | concatenation of full interval (1 -> i) with (i+2 -> n)
1 2 _ _ 5 |
1 _ _ _ 5 | concatenation of full interval (1 -> i) with (i+3 -> n)
---------------------
2 | full interval
2 3 |
2 3 4 |
2 3 4 5 |
2 _ 4 5 | concatenation of full interval (1 -> i) with (i+1 -> n)
2 3 _ 5 |
2 _ _ 5 | concatenation of full interval (1 -> i) with (i+2 -> n)
---------------------
3 | full interval
3 4 |
3 4 5 |
3 _ 5 | concatenation of full interval (1 -> i) with (i+1 -> n)
---------------------
4 | full interval
4 5 |
5 | concatenation of full interval (breaks here)
然后,你要做的是:
1-打印整个时间间隔from = 1
和to = n
2-迭代用“负”部分连接两个间隔
3-再次调用递归(from++, to)
希望有所帮助
答案 1 :(得分:1)
从最右边的元素开始并继续向左移动直到达到1(递归的基本情况)。在基本情况下,返回“1”。
现在开始自下而上构建组合。函数foo
返回字符串的数组列表。在递归的每个级别,有三个部分。 Part1
是前一次调用foo
返回的数组列表;在part2
中,n
将foo
上一次调用返回的所有元素追加到part3
;最后在n
中,将import java.util.*;
class Sequence
{
public static ArrayList<String> foo(int n)
{
if(n==1)
{
ArrayList<String> a = new ArrayList<String>();
a.add("1");
return a;
}
ArrayList<String> withOutN = foo(n-1);
ArrayList<String> out = new ArrayList<String>();
Iterator<String> it = withOutN.iterator();
Integer i = new Integer(n);
while(it.hasNext())
{
String s = it.next();
out.add(s);
s = s.concat("," + i.toString());
out.add(s);
}
out.add(i.toString());
return out;
}
public static void main(String[] args)
{
int n=4;
ArrayList<String> out = new ArrayList<String>();
out = (ArrayList<String>) foo(n);
Iterator<String> it = out.iterator();
while(it.hasNext())
{
System.out.println(( it.next()) );
}
}
}
追加到数组列表中。
{{1}}
答案 2 :(得分:0)
从集{a, b, c, ...}
开始,您希望{a}
和{}
以递归方式加入{b, c, ...}
的所有子集。