正在回答
同学你好,在第一次执行后,s.length() == 0打印出结果后,执行完成printAllArray(s.substring(1), n + s.charAt(0));后,返回方法调用处,会继续使用main方法传入的s变量,所以继续执行s = s.substring(1) + s.charAt(0);的代码,也就是使字符串平移一位。
具体如下:
同学可以尝试,使用debug打入断点的方式,跟踪一下代码的执行情况,会更加清楚的明白哦~
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
同学你好,由于代码的实现有很多思路,这里老师只是简单提供一个思路:
因为本题目会涉及到算法:递归算法,所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解方式。
递归是需要结束条件的,要不然就是无尽的循环了,在下面的段代码中, if (s.length() == 0) 即当传递的参数s长度为0时结束递归。
printAllArray(s.substring(1), n + s.charAt(0));调用方法接收的参数为字符串s和n,每次在方法内部调用自身,即一个递归调用,参数为s.substring(1)和 n + s.charAt(0)); 每次调用的参数都会是参数s的长度减少1,而n增加1,直到结束条件s.length() == 0为真,递归结束,打印一个结果。
递归会进行s.length()次,而且函数调用自身的地方位于循环 for (int i = 0; i < s.length(); ++i) 中,所以会打印出s.length()次结果
s = s.substring(1) + s.charAt(0); 它的作用是使字符串平移一位,如s为"1234",执行此句后就变为了"2341",保证每次产生不重复的结果。
由于“慕课网程序员的梦工厂”字数较多,排列组合次数过多,这里老师以“慕课网”三个字为例:
具体代码如下:
public class Test { static int c = 0; public static void main(String[] args) { String s = "慕课网"; printAllArray(s); } private static void printAllArray(String s) { printAllArray(s, ""); } private static void printAllArray(String s, String n) { if (s.length() == 0) { System.out.println(n + " --- " + ++c); } else { for (int i = 0; i < s.length(); ++i) { printAllArray(s.substring(1), n + s.charAt(0)); s = s.substring(1) + s.charAt(0); } } } }
由于并不是课程中的内容,同学还需要自行理解哦~
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星