为啥这个方法打印出 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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 FFmpeg 打印 SAR 而不是 PAR?

为啥这段代码会打印出无穷大的数字? [关闭]

为啥使用管道在 IPC 中使用 write() 而不是 print() 打印输出两次?

为啥当我尝试打印地图内容时,我得到的是地址而不是值?在 C++ 中

请解释为啥此代码打印 02002 而不是 00022

为啥打印 char* 会给出字符串而不是地址? [复制]