我在学习递归的时候就对这个问题很好奇。
我知道递归打印方法,如
public static void countdown(int n) {
if (n == 0) {
System.out.println("Blastoff!");
return;
} else {
System.out.println(n);
countdown(n - 1);
}
}
和那些创造"金字塔"的人;但是对于不简单或不容易编码的模式呢?例如,
public static void pattern(int n){
code;
}
Output if pattern(2);
+
++
+
Output if pattern(3):
+
++
+
+++
+
++
+
Output if pattern(4):
+
++
+
+++
+
++++
+
+++
+
++
+
我已经在绘图板上花了相当多的时间试图弄清楚有人会如何编码/处理这个。我尝试用模运算符,但它的问题是由于n是任何大于0的#的限制。
我也试过有案例,但由于n是某个数字,这也不起作用。
在Java中,如果你想使用递归,但方法头中的参数不适合它,那么标准的做法是创建一个参数更合适的helper方法,并在内部调用它。
在python或其他支持默认参数的语言中,您只需让k
的默认值从n
中填充自己,并且期望调用者不提供它。
我已经将您的情况实现为递归(它有不同的路径,如果它是增加,减少或在中间-并且在任何方向上,它都在[2 .. 2n-2]
的范围内迭代,n
为中点)。它有点笨拙,当然可以优化,但你可以想象一下——这是一个处理递归的尴尬情况,用一个简单的while
循环会更直接。
public static void pattern(int n) {
_pattern(n, n);
}
private static void _pattern(int n, int k) {
// calculate number of characters to print
int d = n - Math.abs(k - n);
// base case - do nothing
if (d < 2) {
return;
}
// recursive flow
// note that, for the initial run, _both_ if statements activate
if (k <= n) {
_pattern(n, k - 1);
System.out.println("+");
}
System.out.println("+".repeat(d));
if (k >= n) {
System.out.println("+");
_pattern(n, k + 1);
}
}