那是一种方式
def rect(x):
y=x
for i in range(len(x)):
if abs(x[i]) <= 0.5:
y[i] = 1
else:
y[i] = 0
return y
您可以制定尾部递归版本,该版本不需要对返回的结果做任何事情。诸如Scala之类的某些语言可以将其用于优化,从而避免了有限的堆栈深度(和StackOverflow异常),但避免使用Java,例如for now。
public String everyNth(String s,int n) {
if (s.length() >= n) {
return s.charAt(n - 1) + everyNth(s.substring(n),n);
} else {
return "";
}
}
就目前而言,每个堆栈框架的尺寸越小,递归就越深,这应该使它更进一步,但有点怪异:
public String everyNthAcc(String s,String acc,int n) {
if (s.length() >= n) {
return everyNthAcc(s.substring(n),acc + s.charAt(n - 1),n);
} else {
return acc;
}
}
@Test
public void tryIt() {
assertEquals("cccc",everyNthAcc("abcabcabcabc","",3));
}
,
这是一种带有少量参数检查的方法。这个想法是与递归调用一起发送一些状态。每个调用都会在下一个调用时修改状态(startingIndex)。当状态超过某个条件时,递归将停止。在递归调用展开时,将组装结果字符串。
public static void main(String... args) {
System.out.println(everyNth("abcabcabcabc",3));
}
public static String everyNth(String s,int n) {
if (n < 0) {
return "";
}
return everyNth(s,n,n - 1);
}
public static String everyNth(String s,int n,int startingIndex) {
if (startingIndex < s.length()) {
return s.charAt(startingIndex) + everyNth(s,startingIndex + n);
}
return "";
}
,
这是一种不依赖传递索引的方法,对于循环而言,这似乎比递归要多得多。
它使用终止条件,在每次调用时更改起始参数,并使用返回值堆栈返回结果。如果需要,可以用硬编码的'c'替换char参数。
public String countChar(String s,char c) {
if (s.length() == 0) return "";
return (s.charAt(0) == c ? c : "") + countChar(s.substring(1),c);
}
本文链接:https://www.f2er.com/3070638.html