为啥这个方法打印出 347 而不是 3?
Posted
技术标签:
【中文标题】为啥这个方法打印出 347 而不是 3?【英文标题】:Why does this method print out 347 rather than 3?为什么这个方法打印出 347 而不是 3? 【发布时间】:2015-05-16 15:55:56 【问题描述】:假设我有方法
public static void whatsIt(int n)
if (n>10)
whatsIt(n/10);
System.out.print(n%10);
我调用 whatsIt(347),为什么它打印的是 347 而不是 3?
【问题讨论】:
【参考方案1】:您可以逐步了解它的作用:
whatsIt(347)
- is 347 > 10? yes
-- whatsIt(34)
--- is 34 > 10? yes
---- whatsIt(3)
----- is 3 > 10? no
----- print 3 % 10 (-> 3)
--- print 34 % 10 (-> 4)
- print (347 % 10) (-> 7)
【讨论】:
【参考方案2】:如果你想打印 3,使用这个
public static void whatsIt(int n)
if (n>10) whatsIt(n/10);
else System.out.print(n%10);
您的代码如下:
-
whatsit(347):调用 whatsit(34),然后打印 7,然后返回
whatsit(34):调用 whatsit(3),然后打印 4,然后返回。
whatsit(3):打印 3,然后返回。
【讨论】:
【参考方案3】:方法在调用自己时不会停止。当子调用完成后,控制流返回到“原始”方法调用并继续到下一行,即打印,从而打印原始编号。
【讨论】:
【参考方案4】:试试这个:
public static void whatsIt(int n)
if (n>10)
whatsIt(n/10);
else
System.out.print(n%10);
因为如果 n
在您的初始代码中,每个递归调用都打印 n%10。因此,第一个调用 whatsIt(347)
打印 7 (347 % 10),第二个调用打印 4 (34 % 10),第三个调用打印 3 (3 % 10)。这些将在回溯期间以相反的顺序打印,从而为您提供 347。
【讨论】:
以上是关于为啥这个方法打印出 347 而不是 3?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用管道在 IPC 中使用 write() 而不是 print() 打印输出两次?