家庭作业:寻找更好的策略或方法,而不是完整的代码。
在尝试识别此问题的递归案例时,我感到非常困惑。我必须编写一个接受整数参数'n'的方法,然后输出总共'n'个字符。中间字符应始终为''或' *',具体取决于原始整数是奇数还是偶数。以下是几个不同的方法调用和输出应该是这样的:
writeChars(1) -> *
writeChars(2) -> **
writeChars(3) -> <*>
writeChars(4) -> <**>
writeChars(5) -> <<*>>
writeChars(6) -> <<**>>
writeChars(7) -> <<<*>>>
writeChars(8) -> <<<**>>>
我如何尝试识别递归案例?
答案 0 :(得分:2)
你有两个基本情况:n == 1和n == 2.除此之外,递归规则是发出一个“&lt;”,用n-2递归(考虑你要去的两个字符)在此级别发出),然后发出“&gt;”。
答案 1 :(得分:1)
要识别递归,首先考虑如何解决给定n值的问题,假设您有一个方法可以解决较小的情况。尺寸n的解决方案如何与尺寸为n-1的解决方案相关?
执行此操作后,您会发现一个或多个小案例无法以这种方式解决。这些是你的基本情况。
最后,编写一个直接执行每个基本案例的方法。对于大于基本情况的n,它将自身调用为n-1,然后修改该结果以获得大小为n的解。
答案 2 :(得分:0)
我可能会将问题分成3个部分
1.打印<
2.打印*
3.打印>
基于此,我们可以创建一个递归解决方案来打印每个组件。
<
和>
的数量基于公式i % 2 == 1 ? i / 2 : (i - 2) / 2
,然后我们可以编写一个函数来递归打印它们,然后再打印另一个来打印*
。
public class SO15049082 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
print(i);
}
}
private static void print(int i) {
if (i > 0) {
System.out.print("writeChars(" + i + ") --> ");
int c = i % 2 == 1 ? i / 2 : (i - 2) / 2;
printleft(c);
printstar(c % 2);
printright(c);
}
System.out.println();
}
private static void printright(int i) {
if (i > 0) {
System.out.print(">");
printright(i - 1);
}
}
private static void printstar(int i) {
if (i == 1) {
System.out.print("*");
} else {
System.out.print("**");
}
}
private static void printleft(int i) {
if (i > 0) {
System.out.print("<");
printleft(i - 1);
}
}
}
答案 3 :(得分:0)
我考虑递归的方式是传递两个状态(pos,string:s)来改变每个递归调用和三个状态(n,mid1,mid2),这有助于决定如何实现下一个状态。
public static void main(String... arg) {
int n = 10, mid1, mid2;
if (n % 2 == 0) {
mid1 = n / 2;
mid2 = n / 2 + 1;
} else {
mid1 = mid2 = n / 2 + 1;
}
System.out.println(recursion(1, n, mid1, mid2, ""));
}
private static String recursion(int pos, final int n, final int mid1, final int mid2, String s) {
if (pos > n)
return s;
else if (pos == mid1 || pos == mid2)
return recursion(pos + 1, n, mid1, mid2, s + "*");
else if (pos < mid1)
return recursion(pos + 1, n, mid1, mid2, s + "<");
else
return recursion(pos + 1, n, mid1, mid2, s + ">");
}
答案 4 :(得分:0)
我只假设两个基本情况,一个用于n是偶数,一个用于当n是奇数时。
现在在递归调用中我传递n - 2;在奇数n的情况下,它最终为1,对于偶数n,它最终为2。
public static void writeChars(int n) {
if(n < 1)
throw new IllegalArgumentException();
if(n == 1) //odd base case
System.out.print("*");
else if(n == 2) //even base case
System.out.print("**");
else { //recursive case
System.out.print("<");
writeChars(n - 2);
System.out.print(">");
}
}