Java 方法使用递归以相反顺序打印字符数组?
您好,我正在尝试创建一个方法,使用递归以相反顺序打印字符数组 这就是我到目前为止所做的:-Java 方法使用递归以相反顺序打印字符数组?,java,arrays,recursion,Java,Arrays,Recursion,您好,我正在尝试创建一个方法,使用递归以相反顺序打印字符数组 这就是我到目前为止所做的:- public class StringReverseOnCharArray { public static void main(String[] args) { reverseRecursively(new char[]{'a','b','c'}); } private static void reverseRecursively(char[] myCharAr
public class StringReverseOnCharArray {
public static void main(String[] args) {
reverseRecursively(new char[]{'a','b','c'});
}
private static void reverseRecursively(char[] myCharArr)
{
System.out.println(myCharArr[myCharArr.length-1]);
char [] temp=
// what next??
reverseRecursively(temp);
}
}
我想一个临时字符数组就可以了,但是我应该怎么做才能从原始字符数组中删除最后一个元素并创建一个临时字符呢?或者有其他方法可以做到这一点吗?您可能可以使用正如所指出的那样,这不是正常的递归操作。所以这个解决方案并不好,但它是有效的:
public class StringReverseOnCharArray {
public static void main(String[] args) {
reverseRecursively(new char[] { 'a', 'b', 'c' });
}
private static void reverseRecursively(char[] myCharArr) {
if (myCharArr.length > 0) {
System.out.println(myCharArr[myCharArr.length - 1]);
char[] temp = new char[myCharArr.length - 1];
for (int i = 0; i < temp.length; i++) {
temp[i] = myCharArr[i];
}
reverseRecursively(temp);
}
}
}
公共类StringReverseOnCharray{
公共静态void main(字符串[]args){
反向递归(新字符[]{'a','b','c'});
}
私有静态无效反向递归(char[]myCharArr){
如果(myCharArr.length>0){
System.out.println(myCharArr[myCharArr.length-1]);
char[]temp=新字符[myCharArr.length-1];
对于(int i=0;i
更新答案:
我想我误解了。如果您必须使用声明的函数,只需填写temp
位,并且只需以相反的顺序输出数组(而不是实际更改其内容),那么很简单:只需将temp
复制为数组的length-1
字符(可能使用System.arraycopy
)并将新的较短数组传递到函数中。如果接收的数组只有一个字符长,则不要这样做;这就是你的递归终止条件(你总是必须有停止递归的东西,这应该是你在递归地做某事时首先考虑的事情之一)
原始答案: 在我看来,一个作业告诉你在一个问题上使用错误的技巧并不是一个非常有用的作业。递归有各种合适的教学练习;这不是其中之一 但让我们看看作业: 递归的目标基本上是在问题的不同部分重复做一些事情,直到你完成了整个问题。更好的例子是在树结构中循环 因此,看看这个问题,您的目标是交换数组中的字符,直到数组反转为止。这里重复的是什么?交换字符 因此,我可能会让一个索引传入函数,让函数将该索引处的字符与
长度-索引
位置处的字符交换(例如,交换第一个和最后一个,然后交换第二个和第二个到最后一个,等等)。然后让它用索引+1
调用自己
所有递归基本上都必须有一个“停止”条件:函数不再调用自身的点。在您的例子中,这将是索引>=数组的长度/2
请注意,我还没有发布代码。编写代码是完成作业和课程的目的;这是学习的一个重要部分。这里有一个解决方案
private static void reverseRecursively(char[] myCharArr, int next) {
if (next >= myCharArr.length)
return;
// use recusion BEFORE printing in order to print in reversed order
reverseRecursively(myCharArr, next+1);
System.out.println(myCharArr[next]);
}
对该方法的第一次调用应使用0作为“下一个”索引:
其时间复杂度为O(n),空间复杂度为O(1)
?递归不是一种合适的技术。您还可以向方法中添加一个参数,该参数将保存索引的当前值。然后在每次调用时减少索引,并在索引为0时停止递归。@T.J.Crowder-我希望是这样homework@T.J.Crowder这实际上是一个赋值问题,所以我必须使用递归:(无需创建新数组以使其递归。只需传递要在数组中打印的字符的索引,然后通过向该索引减去1来递归调用该方法。这至少会使其保持O(n)而不是O(n^2),因此最后我必须循环:)不可以。首先用数组和长度-1作为参数调用该方法。该方法在给定索引处打印字符,然后用数组和索引-1作为参数调用自己,直到索引小于0为止。@user3263540:不。如果使用递归,则不需要循环。循环是解决问题的正确方法,但如果如果使用递归,您不需要循环。@JBNizet您是对的,但我尝试过不以任何方式更改问题的代码。只是添加缺少的部分…是的,这似乎是在欺骗我,因此阅读您的答案使我有足够的勇气挑战提问者,如果他拒绝向方法添加另一个参数:)是的,如果我可以添加参数,我可以使用此i gr8解决方案如果不允许添加参数,则需要创建一个没有打印值的新数组,然后传递新数组。它会消耗更多的内存(并且需要更多的代码),但我想效率是这个练习最不关心的事情。
reverseRecursively(myCharArr, 0);
def revStr(a,b,str):
if(a-b>len(str)):
return str
else:
str[a],str[b]=str[b],str[a] #Pythons way of replacing characters
return revStr(a+1,b-1,str)