我已经完成了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()
的结尾时,在我看来,它会继续重复输入的最后一个字。我没有得到我失踪的东西。有人可以解释这里的逻辑吗?
答案 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
,如果不是wordlist
则word
调用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;
等等,直到我们到达最后一个字。