我试图找出如何使用递归编写此代码。我已经完成了循环播放,但绝对不知道如何在这里使用递归。我是代码新手。谢谢你的帮助。 附: 对不起,如果我没有解释这是什么。目标是找出给定字符串输入中存在多少匹配括号对。如果集合不平衡,它也应该返回-1。 这些是说明 类名。
MatchingBracesFirstNameLastName.java Stack.java 描述
编写一个程序来匹配括号(),方括号[]和花括号{}。您的程序应该使用递归方法,该方法返回每种类型的大括号的对数,如果特定对的不平衡,则返回-1。您还应该创建一个Stack类,该方法将使用该类来匹配大括号。
import java.util.*;
public class MatchingBraces
{
public static void main(String []args)
{
Scanner input = new Scanner(System.in);
String text = input.nextLine();
System.out.println(match(text, '(', ')', 0));
System.out.println(match(text, '[', ']', 0));
System.out.println(match(text, '{', '}', 0));
}
public static int match(String text, char open, char close, int startIndex)
{
Stack<Character> stack = new Stack<Character>();
int count = 0;
char c;
for(int i = 0; i < text.length(); i++)
{
c = text.charAt(i);
if(c == open)
stack.push(c);
if(c == close)
{
if(stack.empty())
return count;
else if(stack.peek() == open)
{
stack.pop();
count++;
}
}
}
return count;
}
}
答案 0 :(得分:0)
首先,我将重新定义问题的一部分是递归的(或者是面向堆栈的,它们是同构的)。您正在扫描输入字符串,并且您想要计算平衡的令牌对的数量。
因此,您可以将其分解为两个子问题:
这两个问题都可以递归实现,但问题#2更自然地是一个递归问题。这是因为问题自然是嵌套的:当你为一对找到匹配的关闭字符时,如果你遇到一个新的开放字符,你需要先找到匹配的关闭字符 it 在回去寻找当前匹配的关闭字符之前。这是制定问题的经典归纳法或递归法。
如果你的复杂程度更高,你可以通过将子问题制定为:
来解决这两个问题。我现在不会跳到第二个选项的原因是因为返回两个值会打开许多其他问题。您可以使用外部状态变量,或引入一个新类来表示这两个值。它增加了复杂性,但最终在这里添加新类型可能是最好的整体解决方案。
我不想为你做功课,但希望这有助于你了解下一步需要做些什么。希望这有帮助!
答案 1 :(得分:0)
不幸的是,当前的方法签名没有包含足够的信息用于简单的递归解决方案,因此我将添加一个返回两条信息的辅助方法:1。从startIndex开始的下一个打开的堆栈计数,以及2。处理的最后一个字符的位置。
您需要第二条信息,以便呼叫者可以继续递归呼叫停止的地方。
帮助逻辑:
从startIndex开始,向右走,直到遇到打开或关闭或输入结束。
如果您遇到先关闭,请返回-1以进行计数。如果输入结束,则为0.如果遇到先打开,请继续。
如果您遇到下一个打开,请启动子下。检查suball是否为-1,如果是则中止。否则,更新一个局部变量,该变量记录到目前为止由任何子调用返回的最大堆栈计数。继续进行下一个未处理的角色位置。
如果您遇到下一个输入结束,请返回-1表示计数。
如果您遇到下一个关闭,请返回1 + maxOfSubcalls。
注意:如果未达到输入结束,主例程可能需要再次调用帮助程序。在这种情况下,假设没有-1,将返回maxOfHelper。