对于编程分配:
在java中创建一个递归方法,例如n = 5返回
1
0.2
..三合一
... 4
.... 5
... 4
..三合一
0.2
1
(让点是空格或标签)这是一个非常令人头痛的我刚刚开始这个课程所以我在初学者水平,到目前为止我有这个
public String Esc(int n){
if (n <= 1)
return ""+n;
else
return n + "\n" + Esc(n - 1) + "\n" + n;
}
返回
5
4
3
2
1
2
3
4
5
所以我甚至没有关闭,我仍然错过了空间问题
谢谢你的帮助
答案 0 :(得分:0)
诀窍是使用累加器。
class Test {
public static String esc(int n, String accum) {
if(n == 1) {
return accum;
}
int nMinusOne = n -1;
return esc(nMinusOne, nMinusOne + "\n" + accum + "\n" + nMinusOne);
}
public static String esc(int n) {
return esc(n, "" + n);
}
public static void main(String args[]) {
System.out.println(esc(5));
}
}
答案 1 :(得分:0)
最短最简单:
演示:Press Start
代码(首先将m设置为零 - 在演示中看到):
public static String Esc(int n, int m){
m = m + 1;
String s = "";
for ( int i= 0; i< (m-1); i++ ) s += '.';
if (n == m) return s + m;
return s + m + "\n" + Esc(n,m) + "\n" + s + m;
}
甚至更短:
public static String Esc(int n, int m) {
String s = "";
for (int i= 0; i< (m); i++) s += '.';
return n == m+1 ? s+(m+1) : s+(m+1)+"\n"+ Esc(n,m+1) +"\n"+s+(m+1);
}
甚至更短,没有for循环!!演示:Press Start
public static String Esc(int n, int m) {
String s = new String(new char[m]).replace("\0", ".");
return n == m+1 ? s+(m+1) : s+(m+1)+"\n"+ Esc(n,m+1) +"\n"+s+(m+1);
}
用法:
Esc(5, 0);
答案 2 :(得分:0)
你需要的是做你正在做的事情,除了落后。我发现这样做的方法是基本上有一个计数器向上移动到n
,而不是从n
到1
。
像这样:
public static String esc(int n) {
return esc(1, n); // start at 1, go to n
}
// i counts from 1 to n and then stops at n
public static String esc(int i, int n) {
if (i == n) {
return getDots(i - 1) + i; // base case
}
else {
return getDots(i - 1) + i + "\n" + esc(i + 1, n) + "\n" + getDots(i - 1) + i;
}
}
// this method just generates n number of dots for the spacing
public static String getDots(int n) {
String dots = "";
for (int i = 0; i < n; i++) {
dots += ".";
}
return dots;
}
public static void main(String[] args) {
System.out.println(esc(5)); // call the function
}
因此,您可以看到我使用esc(i + 1, n)
而不是n - 1
递归调用该函数。我每次都i
计算1
,直到达到n
。
关于getDots
方法的使用:每个数字前面的点恰好是该数字减去1.因此,无论何时显示数字(i
),只需在它前面显示i - 1
点。
输出:
1
.2
..3
...4
....5
...4
..3
.2
1
答案 3 :(得分:-1)
这是一种方法。
您传递了值n
两次。原因是您使用n1
从 1 to n
打印,然后使用n2
从 n to 1
打印。一旦切换打印指令,您还会传入一个boolean
标志。
此外,您在打印时使用n2
来反转n1
的值:
n1 = 5, print 1
n1 = 4, print 2
// ....
这由公式n2 + 1 - n1
完成,如下所示。
由于你在评论中说你不能使用循环,我将点打印成另一个递归函数。
结果如下:
public static void printDots(int val, int condition) {
if(val < condition - 1) {
System.out.print(".");
printDots(val + 1, condition);
}
}
public static void Esc(int n1, int n2, boolean reverse) {
int val = (n2 + 1 - n1); // this gives 1 for n, 2 for n-1, 3 for n-2 etc.
if (n1 > 1 && !reverse) { // print from 1 to n
printDots(0, val); // print dots
System.out.println(val);
Esc(n1 - 1, n2, reverse);
} else if (n1 <= n2) { // print from n to 1
reverse = true;
printDots(0, val); // print dots
System.out.println(val);
Esc(n1 + 1, n2, reverse);
}
}
public static void main(String args[]) {
Esc(5, 5, false);
}
如果你想使用你在问题中陈述的确切方法签名,你可以在方法中包含我给你的方法:
void Esc(int n) {
Esc(5, 5, false);
}
然后从Esc(5)
致电main()
。您可以将方法命名为相同,因为java支持method overloading
输出:
1
.2
..3
...4
....5
...4
..3
.2
1
答案 4 :(得分:-3)
public class Assignment {
private static int top;
public static void main(String[] args) {
top = 5;
recurse("", 1);
}
public static void recurse(String dots, int value) {
System.out.println(dots + value);
if (value == top) return;
recurse(dots + '.', value + 1);
System.out.println(dots + value);
}
}
它执行如下:
recurse("", 1) {
1 print 1
recurse(".", 2) {
.2 print .2
recurse("..", 3) {
..3 print ..3
recurse("...", 4) {
...4 print ...4
recurse("....", 5) {
....5 print ....5
return
}
...4 print ...4
}
..3 print ..3
}
.2 print .2
}
1 print 1
}
现在在调试器中运行它以了解它实际上是如何工作的。