java - 使用递归计算要打印的内容的数量

标签 java recursion exponent

我学习递归,有一个例子,我解决了编写 * 字符一定次数的问题。

例如:如果您要传入数字 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 颗星。这很奇怪,因为大多数其他递归对我来说都很容易,但这很令人困惑。

最佳答案

我猜它一定总是kn

递归如何工作:它跨越一棵树:

每次调用 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/

相关文章:

java - Collections.reverse 方法不反转条目

java - 如何模拟TCP层?

java - 如何调用此递归最长递增子序列函数

java - Java 中本地、开放和递归时的 boolean 值困惑

c++ - 使用递归段错误核心转储对数组进行排序

floating-point - 为什么我们偏向 float 的指数?

java - 在 hibernate 中映射引用项目中的类

java - 如何创建匿名 Python telnet 连接?

matlab - 在 Matlab 中,如何使用 formatSpec 格式化运算符指定指数中的位数?

r - 如何将多个嵌套括号与指数一起使用?