扫描器对象中返回字符串的数字的倒序(java)

扫描器对象中返回字符串的数字的倒序(java),java,recursion,java.util.scanner,reverse,Java,Recursion,Java.util.scanner,Reverse,我有一个重大的任务,我真的不知道如何去做。任务如下: 在Java公共静态字符串reverse(Scanner scan)中编写一个递归方法,Scanner对象包含数字,这些数字应该以字符串的相反顺序返回。这里有一个棘手的部分,你不允许使用数组、列表或字符串——假设只声明一个变量 反向输入(例如,新扫描仪(“20 33 40”)应返回: “40 33 20” 如果不是因为限制,我会知道如何去做。我真的不知道我该如何解决这个问题。我对编程非常陌生,我知道你们中的一些人反对帮助完成作业,我非常感谢你们

我有一个重大的任务,我真的不知道如何去做。任务如下:

在Java公共静态字符串reverse(Scanner scan)中编写一个递归方法,Scanner对象包含数字,这些数字应该以字符串的相反顺序返回。这里有一个棘手的部分,你不允许使用数组、列表或字符串——假设只声明一个变量

反向输入(例如,新扫描仪(“20 33 40”)应返回: “40 33 20”


如果不是因为限制,我会知道如何去做。我真的不知道我该如何解决这个问题。我对编程非常陌生,我知道你们中的一些人反对帮助完成作业,我非常感谢你们的指点。

第一种可能使用String

您可以直接使用
字符串
作为数据结构。在读取新数字时,在开头而不是结尾添加

基本上使用如下代码:

String str = "";
while (yourcondition) {
    str = scanner.nextInt() + " " + str;
}
return str;
第二种可能使用StringBuffer或StringBuilder

StringBuilder str = new StringBuilder();
while (yourcondition) {
    str.insert(0, " ").insert(0, scanner.nextInt());
}
return str.toString();
第三种可能使用递归:

public String read(String str, Scanner scanner) {
    if (testExitCondition) {
        return str;
    }
    return scanner.nextInt() + " " + str;
}

// Called with System.out.println(read("", scanner));
注意

第一种解决方案使用String创建了许多String实例,但只有一个对它的引用

第二种解决方案使用现有的类,这些类在内部使用数组对字符串进行操作


第三种方法是将对已创建字符串的引用留给JVM,因此代码中不存在对该字符串的显式引用。这是唯一一种没有显式变量声明的方法(仅在方法的签名中,而不是在外部)。

在您的限制下,您会得到结果,然后以相反的顺序输出字符串

public static void main(String[] args) {
    Scanner scanner = new Scanner("20 33 40");
    System.err.println(scan(scanner));
}

public static String scan(Scanner scanner) {
    if (scanner.hasNext()) {
        String next = scanner.next();
        String result = scan(scanner);
        return result.isEmpty() ? next : result + " " + next;
    }
    return "";
}

编写递归方法是每个编程学校的必修课。技巧总是一样的:

  • 检查是否已达到结束条件并返回初始值(在数学中,我们称为中性元素)

  • 拆分输入的某些部分,使用剩余的输入调用递归方法,然后将该调用的结果与之前拆分的部分组合起来

  • 根据该通用算法,您必须以以下方式实现您的方法:

    public static String reverse(Scanner scan) {
        if (scan.hasNextInt()) { // check whether to continue or not
            int number = scan.nextInt(); // split part
            return reverse(scan) + " " + number; // assemble this part and the rest
        } else {
            return ""; // return an initial or base value (the neutral element)
        }
    }
    

    调用递归之前必须先调用
    scan.nextInt()
    ,否则下一个数字就不会被分割。

    您可以使用
    scanner.hasNext()
    while
    循环。使用
    StringBuilder
    收集预先准备好的数据

        Scanner scanner = new Scanner("12 52 10");
    
        StringBuilder builder = new StringBuilder();
        while (scanner.hasNext()) {
            builder.insert(0, scanner.next()).insert(0, " ");
        }
        builder.replace(0, 1, "");
        System.out.println(builder.toString());
    

    你只想要指针

    您必须编写一个递归函数
    stringreverse(Scanner-Scanner)
    ,该函数以相反的顺序返回数字。此任务的目的是让您了解grok递归,这可能类似于向后思考

    reverse()
    函数的第一次运行中,您通过了一个扫描器,内容如下:

    "20 33 40"
    
    因此,从扫描仪中读取一个整数:

    int value = scanner.readInt();
    
    您的字段
    将包含整数20,扫描仪对象现在似乎只包含以下内容:

    "33 40"
    
    因此,假设您有一个反向函数,它将输出“4033”,那么您可以将
    值粘贴到它后面,得到“403320”

    递归是假装你的函数已经做了它应该做的事情,并用更小版本的输入调用你自己,直到你得到一个普通版本。你的第一个调用是“20 33 40”,第二个调用是“33 40”,第三个调用是“40”,最后一个调用是“40”

    您最后一次通过“”的呼叫很简单。您只需检查并返回“”


    其他调用也没有那么难。您只需读取一个int,然后将它与递归调用的输出粘贴到一起,以
    reverse

    我猜stringbuilder也不允许使用?请注意:这不是“我们中的一些人”反对在作业中提供帮助。重点是:这个网站有一些政策,可以提出好的问题;而作业帮助并不是一个好的类别……你不允许使用数组、列表或字符串。它也是
    “只假设声明一个变量。”
    ,但我认为如果您只需内联
    nextInt()
    调用,
    StringBuilder
    方法就可以工作。我删除了对int声明的引用。我认为该方法是返回值所必需的,而不是简单地打印出来。我修改它以提供返回值非常简单的解决方案…感谢您提供了清晰的说明!