java 这是一个递归程序,给出错误的输出,请帮助我

vybvopom  于 2023-02-11  发布在  Java
关注(0)|答案(4)|浏览(138)

我在一本书上看到过这样一个程序:
下面是一个程序:打印整数,这里你有一个正整数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方法只输入了一次,应该是问题所在,但是我不知道怎么修改,麻烦你帮我一下,谢谢

n3schb8v

n3schb8v1#

您需要从左到右(从最高有效位到最低有效位)输出数字。
最右边的数字(n % 10)比最左边的数字(n除以...... 10的某个幂)更容易得到,所以递归将采用以下形式:

To print out a number:
  if longer than one digit
    recurse on the number without its rightmost digit
  print out the rightmost digit

并且更精确地,

To print_number n:
  if n > 9
    print_number n / 10
  print_digit n % 10
bnlyeluc

bnlyeluc2#

PrintDigit只在n小于10时调用,因此只发生一次...
当你递归调用的时候,你还需要调用PrintDigit

public static void printOut(int n)
    {
        if (n >= 10)
        {
            printOut(n / 10);
        }
        printDigit(n % 10);
    }
9gm1akwq

9gm1akwq3#

在每一次迭代中,对于你的例子76234〉7623〉762〉76〉7,数字会减少10,现在7小于10,所以递归函数调用print方法,7被打印出来。
下面是解决此问题的示例。

class Print
{
    public static void printOut(int n)
    {
        if (n == 0) return ;
        printOut(n / 10);
        printDigit(n % 10);
    }

    static void printDigit(int n)
    {
        System.out.print(n); //7
    }
}
m1m5dgzv

m1m5dgzv4#

你的printDigit函数是可以的,只是不要用else块 Package 它:

public static void printOut(int n)
    {
        if (n >= 10)
        {
            printOut(n / 10);
        }
        printDigit(n % 10);
    }

另外,我个人不喜欢从书本上学习任何编程语言,因为它们已经过时了,而且作者们经常在算法上很糟糕。而且一旦他们犯了错误,就没有机会重新出版一本书,但在Github中有问题,拉取请求,评论,代码是可编辑的也是可分叉的。

相关问题