我学习递归,有一个例子,我解决了编写 * 字符一定次数的问题。
例如:如果您要传入数字 3,它应该打印 2^3 颗星,因此它会打印出 8 颗星。
我应该将其打印 2 ^ k 次,其中 k 是传递的整数。问题答案是:
public String printStars(int k) {
if (k == 0)
return "*";
else
return printStars(k - 1) + printStars(k - 1);
}
我似乎无法理解调用堆栈以及如何解决问题,我的看法是,当我为 int k 传递 3 时,它会执行 n - 1 3 次,直到达到基本情况,并且会在此之前的调用中返回 2 颗星,并且由于需要 3 个级别才能达到如此深度,因此它将打印 3 x 2 颗星,因此它将打印 6 颗星。这很奇怪,因为大多数其他递归对我来说都很容易,但这很令人困惑。
最佳答案
我猜它一定总是k
或n
?
递归如何工作:它跨越一棵树:
每次调用 printStars 都会导致一个 *
(2^0) 或两个 *
(2^1)。
如果你调用 printStars(4):
递归级别 4 ist != 0,因此它返回自身的两个单独调用的收缩,每个调用都带有参数 (3)。
递归级别 3 ist != 0,因此它返回自身的两个单独调用的收缩,每个调用都带有参数 (2)。
递归级别 2 ist != 0,因此它返回自身的两个单独调用的收缩,每个调用都带有参数 (1)。
递归级别 1 ist != 0,因此它返回自身的两个单独调用的收缩,每个调用都带有参数 (0)。
递归级别 0 ist == 0,因此每次调用都会返回一个 *
。
回到递归级别 1,我们收到两个 *
并收缩并返回它们。
回到递归级别 2,我们收到两个 **
并收缩并返回它们。
回到递归级别 3,我们收到两个 ****
并收缩并返回它们。
回到递归级别 4,我们收到两个 ********
并收缩并返回它们。
因此调用者收到 '****************' 2^4=16 *'s
caller |
k=4 / \ (just call yourself 2 times an return contraction of both calls)
k=3 / \ / \ (just call yourself 2 times an return contraction of both calls)
k=2 / \ / \ / \ / \ (just call yourself 2 times an return contraction of both calls)
k=1 /\ /\ /\ /\ /\ /\ /\ /\ (just call yourself 2 times an return contraction of both calls)
k=0 ** ** ** ** ** ** ** ** (just return 2^0 = 1 '*')
关于java - 使用递归计算要打印的内容的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36001334/