一、题目描述
课堂上的一个问题,输入的要求是 一个字符 按一下回车 接着继续输入字符,以#号结束,当结束的时候 逆序依次 输出 输入的字符
需要使用递归实现
关于递归
递归这里不再多说,就是自己调用自己,调用自己逐次压栈,当遇见 递归截止 的条件(一般为 return ...
)
然后逐次出栈,出栈的时候会给相邻未出栈 的 一个 return 结果
,(谁调用的你,你最起码给他一个答复啊~)从而 保证 下一个函数 也能出栈
(递归思想简单理解就是分块,分成能操作的一块
+ 暂时不能操作的一块
,然后不能操作的一块
,也分成 他的 能操作的一块
和 他的 不能 操作的一块
…)
解题的思路
当输入的不是 #
字符时,就进入递归函数的递归分支中,开始输入的元素会依次压栈(一般设置 进入下层递归 在 return 语句之前),直到 输入 #
就 return
结束递归
举个形象的小例子:
可以简单理解不得到return
誓不罢休,把每次递归比作增加士兵,return
就相当于 战斗胜利,直到战斗胜利,才停止增多兵力,开始撤兵
而最前面的士兵 才知道战斗是否胜利,胜利之后,只能告诉相邻 后边 的士兵 …
结束递归的最后一层有了return ,也就是 调用最后一层 的 倒数第二层 有了结果(也就是倒数第二层的任务已经完成,他的任务就是 使 倒数 第一层 有结果)
-
那么栈顶的元素就能出栈
-
栈顶的能出栈,栈顶压着的相邻也能出栈
-
…
如果还是不太明白,先搞清递归的定义和栈的相关知识~
二、代码
package two.test;
import java.util.Scanner;
public class Demo1_DiGuiNiXuZIFuChuan {
public static void main(String[] args) {
System.out.println("请逐个输入字符(每个字符后面一个回车,结束字符为 # ):");
diGui();
}
private static void diGui() {
Scanner sc = new Scanner(System.in);
String str = sc.next();
//注意这里用 == 是不行的,对于字符串 == 比较的是内存中的地址,需要用equals()函数
if(str.equals("#")){
return;
}
else{
diGui();
System.out.println(str);
return;
}
}
}
三、== 和 equals()
这里需要注意,正如前面代码所说那样,为何 ==
不能正确结束,而必须要用equals()
呢
参考往期博客:https://blog.csdn.net/qq_24654501/article/details/108859275