0
public class Prod {
    public static void main(String[] args) {
        System.out.println(prod(1, 4));
    }
    public static int prod(int m, int n) {
        if (m == n) {
            return n;
        } else {
            int recurse = prod(m, n-1);
            int result = n * recurse;
            return result;
        }
    }
}

运行上面的代码,我得到 24 ? 我不太明白怎么做?

我的疑惑: 1. 当 m =1 , n=4 时,我们调用 prod 直到 m 和 n 等于 1。那么输出应该是 n 并且不应该执行 else 块?

有人请帮助我理解逻辑。

4

3 回答 3

1

只需使用数字运行它,您需要将其写下来以准确查看行为(将来,我建议在您的代码中添加大量打印以检查变量以及它们在每次通过时如何变化)。

prod(1,4)
m=1,n=4
m != n so, recurse = prod(1, 3)

prod(1, 3)
m=1,n=3
m != n so, recurse = prod(1, 2)

prod(1, 2)
m=1,n=2
m != n so, recurse = prod(1, 1)

prod(1, 1)
m=1,n=1
m == n so,
return 1

returns to prod(1, 2)
recurse = 1
result = 2 * 1
return 2

returns to prod(1, 3)
recurse = 2
result = 3 * 2
return 6

returns to prod(1, 4)
recurse = 6
result = 4 * 6
return 24

因此,您的程序打印 24。

有时,找出程序的最佳方法是机械地逐行执行这些步骤,在脑海中执行它们(或在纸上跟踪事物)。

于 2013-02-20T22:37:27.310 回答
0

要理解任何带有函数的程序,您假设被调用的函数正确地完成了它们的工作,并检查调用函数是否以正确的顺序使用正确的参数调用它们,并正确地组合结果。

对于递归函数,您需要检查每个递归调用是否让您更接近没有递归的情况。

这里没有人告诉我们结果应该是什么。递归在任何时候结束m == n,并且递归调用是 with n = n - 1,所以这仅在m <= n.

考虑一串调用,每个调用减少n1,同时m保持不变。说n == m + 3找出发生了什么:第一个调用gets m + 2,第二个m + 1,第三个m,然后returns m。第二个 take n == m + 1bym由第三个返回,第二个 taken == m + 2乘以前一个结果,最后结果是(m + 3) * (m + 2) * (m + 1) * m. 此函数计算n! / (m - 1)!,如果n >= m。知道这就是正在发生的事情,很容易检查我们的(到目前为止)预感是否正确。

于 2013-02-20T22:49:01.733 回答
0
prod(1, 4);

public static int prod(int m, int n) {
    if (m == n) {
        return n;
    } else {
        int recurse = prod(m, n-1);
        int result = n * recurse;
        return result;
    }
}

可以用 m == 1 转换为:

prodA(4);
public static int prodA(int n) {
    if (1 == n) {
        return n;
    } else {
        int recurse = prodA(n-1);
        int result = n * recurse;
        return result;
    }
}

它有一个转换(头递归):

public static int prodA(int n) {
    int result = 1;
    while (n > 1) { // Actually n != 1
        result *= n;
        --n;
    }
    return result;
}

这是阶乘函数。

于 2013-02-21T00:03:05.813 回答