Java 如何返回到函数中的上一次迭代,以便重新执行

Java 如何返回到函数中的上一次迭代,以便重新执行,java,function,recursion,Java,Function,Recursion,我有一个递归函数来显示树(我不允许共享代码,但我真的需要帮助来解决这个问题) 无效显示(节点根) 此功能必须实现以下功能:, 如图所示 输出 A 选择要查看的节点:a B C D 选择要查看的节点:B EF 这一点,我能够实现,但我如何回到显示B C D的迭代,以便将D作为下一个要查看的节点,并将gh作为显示? 即 输出 A 选择要查看的节点:a B C D 选择要查看的节点或输入Z返回上一级别:B ef 选择要查看的节点或输入Z返回上一级别:Z B C D 选择要查看的节点:D G H 选择要

我有一个递归函数来显示树(我不允许共享代码,但我真的需要帮助来解决这个问题) 无效显示(节点根)

此功能必须实现以下功能:, 如图所示

输出
A
选择要查看的节点:a
B C D
选择要查看的节点:B
EF

这一点,我能够实现,但我如何回到显示B C D的迭代,以便将D作为下一个要查看的节点,并将gh作为显示? 即 输出
A
选择要查看的节点:a
B C D
选择要查看的节点或输入Z返回上一级别:B
ef
选择要查看的节点或输入Z返回上一级别:Z
B C D
选择要查看的节点:D
G H

选择要查看的节点或输入Z返回上一级:

就像我理解您的问题一样,您有一个交互系统,用户可以在其中控制遍历。对于您的问题,您不应该使用递归函数。您最好在以下位置使用堆栈:

  • 当用户从显示的节点列表中选择节点时,推送选定节点
  • 当用户选择选项Z时,从堆栈中弹出顶部节点

  • 编辑:在一个简单的系统中,您也可以使用递归函数。在上面的案例1中,您使用所选节点调用函数,在案例2中,您从函数返回。但是,只有当您可以处理函数中的用户输入(例如文本UI)时,这才应该起作用。

    如果您的节点是对象,并且它们知道自己的子节点和父节点,您可以尝试以下操作(伪代码):

    您只需要为第一次调用提供一个启动方法,以及一些东西来打破这个无限循环

    更新:这是一次考虑了@macmoonshine所说内容的更新。在这种情况下,节点不需要知道谁是它们的父节点。仍然需要启动方法和中断

    void myMethod( Node)
    {
        while (true)
        {
        show all children of Node;
        take input from user;
        if(node choosen)
            myMethod( node);
        if( got Z in input)
            return;
        }
    
    }
    

    伙计们,提到投票失败的原因,他是个新人,甚至不知道自己做错了什么。所以仅仅是投反对票是行不通的。是的,请告诉我你为什么投反对票。我将编辑我的问题。到目前为止,你尝试了什么?我真的看不出有什么问题。请注意,即使您不能显示实际代码,您也应该能够生成可以用作此问题占位符的代码。没有代码,这个问题与java无关。您提到过您有一个递归函数。考虑一下递归的基本原理:我已经编辑了我的问题来展示我所做的事情。程序终止,但不进入之前的迭代。我理解你的建议。正如你所说,我可能根本不需要递归函数。我将尝试堆栈实现。现在,我将用户输入作为文本。最后,我将开发一个UI,要求用户单击他们想要查看的节点。选择选项Z时应返回,而不是进行递归调用。此外,许多树实现中的节点都无法访问其父元素。@macmoonshine如果返回,我就完成了。它将返回到以前的方法,但它将刚刚结束。你不能那样做。不,你会升一级。您还应该在代码中包含该案例的循环,该循环将再次显示选择对话框。@macmoonshine我更新了我的答案以包含您所说的内容。添加了一个循环,不需要知道父对象。这将终止执行。我需要重新执行上一次迭代。我试着使用stack,它很管用。
    void myMethod( Node)
    {
        show all children of Node;
        take input from user;
        if(node choosen)
            myMethod( node);
        if( got Z in input)
            myMethod( Node.parent);
    }
    
    void myMethod( Node)
    {
        while (true)
        {
        show all children of Node;
        take input from user;
        if(node choosen)
            myMethod( node);
        if( got Z in input)
            return;
        }
    
    }