给定N个counto从1到n和n到1的递归方法java

时间:2014-10-08 02:21:35

标签: java recursion

对于编程分配: 在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
所以我甚至没有关闭,我仍然错过了空间问题 谢谢你的帮助

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,而不是从n1

像这样:

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

Here is a running example

输出:

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
}

现在在调试器中运行它以了解它实际上是如何工作的。