2016-11-22 16 views
0

我的计划是想打印的递归调用我把这样的数字:为什么我打印的呼叫数量递归在Java中以这种特殊的方式错了吗?

例如:拨打4次

This was written by call number 2. 
    This was written by call number 3. 
    This was written by call number 4. 
    This ALSO written by call number 4. 
    This ALSO written by call number 3. 
This ALSO written by call number 2. 
This ALSO written by call number 1. 

缩进的假设是这样的了。

我的代码会产生这样的事情,而不是:

This ALSO written by call number 4. 
This ALSO written by call number 3. 
This ALSO written by call number 2. 
This ALSO written by call number 1. 
This was written by call number 2. 
This was written by call number 3. 
    This was written by call number 4. 

它假设是从我所看到的简单的,但我的输出,否则说。

我的代码,而无需主要方法和构造函数(它们不会影响任何东西),我没有删除却把也是String类型,在前面的空间:

import java.util.*; 

public class callNumber 
{ 
    Queue intStack = new LinkedList(); // stores call numbers for printing second string 
    private String st1 = "This was written by call number "; 
    private String st2 = "This ALSO written by call number "; 
    int i = 2; 

    public void callingNum(int num) 
{  
    intStack.add(num); 

    i = num; 
    if(num >= 2) 
    { 
     callingNum(num - 1); 
     System.out.println(st1 + num + "."); 
     st1 = " " + st1; 
     st2 = " " + st2; 
    } 

    if(i == num) 
    { 
     while(!intStack.isEmpty()) 
     { 
      System.out.println(st2 + intStack.remove() + "."); 
      st2.replaceAll(" ", ""); 
     } 
    } 

    i++; 
} 
+1

'新的String(“‘)'等同于'’”',除了它在堆上创建额外的对象。不要这样做。 – shmosel

+0

@shmosel我修好了。 – Eap123

+0

'而(!intStack.isEmpty())'将清空队列中的第一次调用完成,这只要'num'达到1发生。 – teppic

回答

0

首先,你的序列打印和通话是错误的;这就是为什么你会违规排队。这项任务说明了差异。您的基本顺序必须是:

print "was written" line 
recur with N-1 
print "ALSO written" line 

您已经颠倒了前两个步骤,这是您的行顺序错误的原因之一。

intStack;这会导致你各种问题。由于teppic指出,您的循环清空堆栈 - 当你需要只打印一行。当你摆脱intStack,你只剩下打印,应该正常工作。

只是让运行时系统会为您处理的堆积;每次调用应该担心的只是自己的部分:

上午我做了什么? 如果没有, 做一个简单的事情 这个问题的一个简化版本(也就是N-1)

在这个问题重复发生,你的“一个简单的事情”有两个部分:递归之前打印一条线;之后再打印另一行。

相关问题