Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何理解名字的每一个字谜';在不使用任何循环类型的情况下使用递归来初始化?_Java_Recursion_Anagram - Fatal编程技术网

Java 我如何理解名字的每一个字谜';在不使用任何循环类型的情况下使用递归来初始化?

Java 我如何理解名字的每一个字谜';在不使用任何循环类型的情况下使用递归来初始化?,java,recursion,anagram,Java,Recursion,Anagram,这是我到目前为止得到的 我想让它看起来像是ABC的缩写: ABC ACB BAC BCA CAB CBA 。。。但我似乎无法实现 import java.util.*; 公共类字谜{ 公共静态字符串交换(字符串n){ int count=n.length(); char[]temp=n.toCharArray(); int in_pos=0; 如果(计数器(计数)==1){ 回答“谢谢!”; }否则{ 计数器(计数); 字符串s=字符串.valueOf(临时); 回报掉期; } } 公共静态整

这是我到目前为止得到的

我想让它看起来像是ABC的缩写:

ABC
ACB
BAC
BCA
CAB
CBA
。。。但我似乎无法实现

import java.util.*;
公共类字谜{
公共静态字符串交换(字符串n){
int count=n.length();
char[]temp=n.toCharArray();
int in_pos=0;
如果(计数器(计数)==1){
回答“谢谢!”;
}否则{
计数器(计数);
字符串s=字符串.valueOf(临时);
回报掉期;
}
}
公共静态整数计数器(整数c){
如果(c==0){
返回1;
}否则{
返回c*计数器(c-1);
}
}
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
系统输出打印(“全名:”);
字符串名称_full=in.nextLine();
System.out.print(“输入您全名的首字母:”);
字符串名称_initials=in.nextLine();
String rep_space=name_首字母。replaceAll(“\\s”,”);
System.out.println(交换(rep_空间));
}
}

这个答案假设字符串中的字母是唯一的。否则将需要修改以防止重复的字谜

编写字谜函数的一种方法是循环每个字符
c
,递归计算其他字母的字谜,并将子字谜附加到每个
c
。基本大小写是当字符串只有一个字符时

例如,下面是一个Java实现:

import java.util.ArrayList;
导入java.util.List;
公共类字谜{
公共静态列表字谜(字符串s){
列表输出=新的ArrayList();
如果(s.length()==0)
返回输出;
如果(s.长度()==1){
输出。添加(s);
返回输出;
}
对于(int i=0;i
但是,这种方法不能满足不使用任何循环的约束。该解决方案可适用于使用递归递增索引的函数替换for循环,基本情况是当索引超出范围时

例如,下面是一个Java实现,后面是有关将
For
循环转换为相应递归函数的详细信息

import java.util.ArrayList;
导入java.util.List;
公共类字谜{
公共静态列表字谜(字符串s){
列表输出=新的ArrayList();
如果(s.length()==0)
返回输出;
如果(s.长度()==1){
输出。添加(s);
返回输出;
}
//递归迭代字符
阶级战车{
公共无效运行(int char\u idx){
如果(char_idx>=s.length())
返回;
字符串c=s.substring(char\u idx,char\u idx+1);
//从字符串s中删除字符c以形成字符串s2
字符串s2=s.substring(0,char_idx)+s.substring(char_idx+1);
//计算s2的字谜,并将每个字谜附加到字符c
列表字谜2=字谜(s2);
//递归迭代子字谜
阿那格拉米特类{
公共无效运行(int anagram_idx){
如果(anagram_idx>=anagrams2.size())
返回;
add(c+anagrams2.get(anagram_idx));
运行(字谜+1);
}
}
新建AnagramIter()。运行(0);
运行(char_idx+1);
}
}
新建CharIter()。运行(0);
返回输出;
}
公共静态void main(字符串[]args){
列表l=字谜(“abc”);
for(字符串s:l){
System.out.println(s);//abc、acb、bac、bca、cab、cba
}
}
}
将循环转换为递归函数 对于每个转换的循环,结束循环的条件用作递归函数的基本情况,循环体用作递归函数体。为了传达这一想法,下面的示例显示了如何使用
for
循环和递归函数打印
0
3
之间的整数

公共类循环{
私有静态int NUM_循环=4;
//迭代循环
专用静态void loop_iter(){
for(int i=0;i=NUM\u循环)
返回;
系统输出打印LN(i);
环_rec(i+1);
}
公共静态void main(字符串[]args){
loop_iter();//输出0、1、2、3
System.out.println();
loop_rec(0);//输出0、1、2、3
}
}
因为函数调用需要额外的堆栈内存,递归方法将比迭代方法使用更多的堆栈内存。一些语言(例如Scheme)利用尾部调用优化,这样递归尾部调用就不会使用任何额外的堆栈空间,但这是非常有用的
0 [[A], [B], [C]]
1 [[A], [B], [C]]
2 [[A], [B], [C]]
Number of permutations: 6
[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, A, B]
[C, B, A]