2017-04-06 105 views
0

以下是我对AP计算机科学问题的修改。 书上说应该打印0010我认为它应该打印0010012 但实际上下面的代码打印3132123Java - 递归

这是怎么回事? 另外它似乎没有任何停止条件?

public class Mystery { 

    public static void main(String[] args) { 
     int n; 
     n = 3; 
     mystery(n); 
    } 

    public static void mystery(int n) { 
     int k; 
     for (k = 0; k < n; k++) { 
      mystery(k); 
      System.out.print(n); 
     } 
    } 
} 

实际问题显示为: 请考虑以下方法。

public void mystery (int n) 
{ 
    int k; 
    for (k=0 ; k < n ; k++) 
    { 
      mystery(k); 
      System.out.print(n); 
    } 
} 

呼叫神秘(3)返回什么值?

我现在明白循环形成停止条件,我想我理解jhamon的评论“最后的指令是打印n。n是3,没有办法只打印'0010012'”但我不明白为什么书上说,应该从我所看到的打印00100123.

由于Batsheba说,我已经试过看着变量在调试,但书上说应该打印00100123. 非常感谢jhamon对更正后的代码,所以这本书是错的?

+1

最后的指令是打印'n'。 ''n'is 3,没有办法只打印'0010012' – jhamon

+3

'它也没有任何停止条件吗?!'它有一个:'k BackSlash

+1

回答

1

该程序不能打印“0”。它打印n,如果n为0,它将永远不会到达System.out.print(n)行。该行位于for陈述内,其中k<n

正如其他人在评论中指出的那样,for循环中的条件也是停止条件。 mystery将递归调用自己n次。但是,在每个调用中,参数都较小。
(为了好玩,尝试将条件改为k <= n。然后它不会终止,因为参数小于或等于)。

如果将行更改为print(k),这可能是预期的,它确实会打印“0010012”。 这是一个ideone link来表明。

+1

将印刷品放在印花织物外面,并获得书中给出的结果。这里是你的ideone的一个分支[http://ideone.com/1s1YYt](http://ideone.com/1s1YYt) – jhamon

+0

@jhamon好找!顺便说一句,你应该编辑评论。有一个“)”应该有一个“]”,打破了这个联系。 –