我在一本书上看到过这样一个程序:
下面是一个程序:打印整数,这里你有一个正整数n,你想把它打印出来,程序的名字是printOut(n),假设有一个现有的例程,它只处理一个数字,并把它输出到终端,打印一个数字的例程叫做printDigit。
这个程序要求使用递归。
本书中给出的示例代码是:
public static void printOut(int n)
{
if (n >= 10)
{
printOut(n / 10);
}
else
{
printDigit(n % 10);
}
}
例程printDigit
的代码书上没有给出,我想了想,程序应该是这样的:
public class PrintOutTest
{
public static void main(String[] args)
{
Print.printOut(76234);
}
}
class Print
{
public static void printOut(int n)
{
if (n >= 10)
{
printOut(n / 10);
}
else
{
printDigit(n % 10);
}
}
static void printDigit(int n)
{
System.out.print(n); //7
}
}
但是当我运行它的时候,终端只输出数字7。
我仔细看了一下,发现printDigit方法只输入了一次,应该是问题所在,但是我不知道怎么修改,麻烦你帮我一下,谢谢
4条答案
按热度按时间n3schb8v1#
您需要从左到右(从最高有效位到最低有效位)输出数字。
最右边的数字(
n % 10
)比最左边的数字(n
除以......10
的某个幂)更容易得到,所以递归将采用以下形式:并且更精确地,
bnlyeluc2#
PrintDigit
只在n小于10时调用,因此只发生一次...当你递归调用的时候,你还需要调用
PrintDigit
。9gm1akwq3#
在每一次迭代中,对于你的例子76234〉7623〉762〉76〉7,数字会减少10,现在7小于10,所以递归函数调用print方法,7被打印出来。
下面是解决此问题的示例。
m1m5dgzv4#
你的printDigit函数是可以的,只是不要用else块 Package 它:
另外,我个人不喜欢从书本上学习任何编程语言,因为它们已经过时了,而且作者们经常在算法上很糟糕。而且一旦他们犯了错误,就没有机会重新出版一本书,但在Github中有问题,拉取请求,评论,代码是可编辑的也是可分叉的。