有人可以解释本守则中的递归

时间:2016-02-26 03:21:16

标签: java

我已经完成了HTML,但这与在我的AP课程中学习java完全不同。所以我对编码非常陌生。今天我们学习了递归,我非常确定在使用它时就像在这个视频中一样。

https://www.youtube.com/watch?v=fpuWkZs51aM

但我们不得不以不同的方式使用它。我们需要制作一个名为WordPlay的程序,一次接受任何一个单词,直到单词" STOP"输入。当停止时,它以相反的顺序打印出来。这是代码。

import java.util.Scanner;

public class HelloWorld
{
    public static void main(String[] args)
    {

        System.out.println("Enter list of words, one per line");
        System.out.println("Final word should be STOP");
        wordList();
    }
    public static void wordList()
    {
        Scanner keyboard = new Scanner(System.in);

        String word = keyboard.next();
        if (word.equalsIgnoreCase("STOP"))
            System.out.println();
        else
            wordList();
        System.out.println(word);
    }
}

所以我不理解的部分是这样可以正常工作但是当我看到wordList()的结尾时,在我看来,它会继续重复输入的最后一个字。我没有得到我失踪的东西。有人可以解释这里的逻辑吗?

7 个答案:

答案 0 :(得分:0)

该函数将像往常一样从上到下执行,但如果它进入else块,它将跳回到开头,如下所示。它会“循环”。完全是这样,直到word等于"停止"然后它进入if块,打印出一个新行(System.out.println())然后跳过else块,打印出来word然后退出该函数。 if-else语句中的括号将使这更容易看到。

public static void wordList()
{
  |->Scanner keyboard = new Scanner(System.in);
  |
  | String word = keyboard.next();
  | if (word.equalsIgnoreCase("STOP")) {
  |   System.out.println();
  | }
  | else {
  |---wordList();
    }
    System.out.println(word);
}

答案 1 :(得分:0)

递归 输出输入的单词,但每次调用wordList都会获得一个名为word的新本地变量(每个{ {1}}值已打开" the stack")。如果您将其标记为word,则不会抱怨 - 因为在初始化之后final未被修改。此外,您应该提取word(每次调用都会创建一个新的本地调用)。

Scanner

答案 2 :(得分:0)

它基本上是一个递归函数或方法,它一次又一次地调用自己,直到它内部的条件为假。 因此,用户输入的第一个新单词存储在名为word的变量中,然后if condition将检查word中存储的值是否为Stop,如果不是wordlistword调用1}}方法,并再次重复上述所有过程。 因此,每次输入的新值都存储在<?php namespace Yourpackage\Yourmodule\Block\Adminhtml\Sample; class Grid extends \Magento\Backend\Block\Widget\Grid\Extended { protected $_yourmodelFactory; public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Backend\Helper\Data $backendHelper, \Yourpackage\Yourmodule\Model\YourmodelFactory $yourmodelFactory, array $data = [] ) { parent::__construct($context, $backendHelper, $data); $this->_yourmodelFactory = $yourmodelFactory; } protected function _construct() { parent::_construct(); $this->setId('sample_grid'); $this->setDefaultSort('id'); $this->setDefaultDir('DESC'); $this->setSaveParametersInSession(true); } protected function _prepareCollection() { $collection = $this->_yourmodelFactory->create()->getCollection(); $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $this->addColumn( 'id', [ 'header' => __('ID'), 'align' => 'right', 'width' => '50px', 'index' => 'id', ] ); // Some columns return parent::_prepareColumns(); } } 变量中。 多数民众赞成!!

答案 3 :(得分:0)

public static int wordList()
{
    Scanner keyboard = new Scanner(System.in);

    String word = keyboard.next();
    if (word.equalsIgnoreCase("STOP"))
    {
      System.out.println();
      return 0;
    }
    System.out.println(word);
    return wordList();
}

试试这个

答案 4 :(得分:0)

这将是操作序列

1)调用wordlist()
2)得到一个单词,说WORD1并存储在局部变量字中。
3)在递归调用wordlist之前,WORD1进入堆栈。堆栈就像一个盒子,你可以把饼干放在另一个上面,然后你就可以拿出最后放的饼干。现在堆栈有WORD1
4)得到另一个词,说WORD2并存储在局部变量字中。这是一个新的函数调用,即使它是递归的。所以一个新的局部变量字被分配了内存。
5)在递归调用wordlist之前,WORD2进入堆栈。所以现在WORD2将是最顶层的,WORD1将位于堆栈的下方。
5)得到另一项工作,现在是停止。
6)打印STOP 7)功能返回 8)现在流程返回到上一个呼叫。现在WORD2从堆栈中弹出,因为持有WORD2的局部变量属于递归调用的这个实例。
8)打印WORD2并返回上一个呼叫。现在WORD1从堆栈中弹出,因为持有WORD1的局部变量属于递归调用的这个实例
9)WORD1打印。

只是告诉你一个类比,让我们假设你有类似的任务。你必须从站在你身边的朋友那里得到一套书。一旦他给你一本名为stop的书,你就必须按照相反的顺序将书还给他。

1)你从他那里得到了这本书 2)在拿到下一本书之前,你把它放在桌子上,因为你不能拿着这本书并从朋友那里得到更多的书 3)从他那里得到下一本书 4)在获得下一本书之前,你将它保留在第一本书上 5)你继续这样做,直到你得到一本名为stop
的书 6)现在你开始归还书籍了,首先你将返回名为stop的书,当你继续书时,由于书籍已经堆叠,你将以相反的顺序返回书籍。

希望这澄清一下。

答案 5 :(得分:0)

如果第System.out.println(word)行在if语句之前,则会重复输入最后一个单词。

要理解递归,你需要“堆栈”的概念。每次调用wordList()都发生在堆栈中的单独级别。每个堆栈级别都有一个不同的word变量。

由于``System.out.println(word)`行在递归调用之后发生,所以当解除堆栈时(即在前一级别返回之后)执行每一行。这就是为什么单词以相反的顺序出现的原因。图片:如果你把一个盒子堆放在另一个上面,当你打开它们时,最后一个盒子是第一个出去的(因此缩写LIFO = Last In First Out)。

递归的另一个重要概念是有一种方法可以阻止递归(即防止无限递归)。在此程序中,当用户输入“STOP”时完成。

答案 6 :(得分:0)

我喜欢将这些问题视为“调用堆栈”。每次你打电话&#39;该方法递归地添加另一个&#39;堆栈&#39;。每个递归方法都需要一个停止案例。在你的问题中,第一次出现的单词“停止”&#39; (如何方便)充当你的停止案例。 例如,如果有人输入:

&#34;福克斯&#34; &#34;熊&#34; &#34;鹿&#34; &#34; STOP&#34;

一旦#34; STOP&#34;出现,它将被打印出来。现在,我们从您的“电话堆栈”中选择我们离开的位置。这是

的结尾

单词表()

现在唯一的步骤是

的System.out.println(字)

这个词&#39;鹿&#39;将打印,现在我们打印的列表是:

&#34; STOP&#34; &#34;鹿&#34;

等等,直到我们到达最后一个字。