繁体   English   中英

JAVA递归程序逻辑

[英]JAVA Recursive Program logic

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,否则不应执行块?

有人请帮助我理解逻辑。

只需使用数字进行遍历,您需要将其写下来以准确查看其行为(将来,我建议在代码中添加大量打印内容,以检查变量以及变量在每次传递过程中的变化)。

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。

有时,找出程序的最佳方法是机械地逐行执行各个步骤,然后在脑海中(或在纸上追踪它们)执行它们。

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

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

在这里,没有人告诉我们结果应该是什么。 每当m == n ,递归结束,并且递归调用的n = n - 1 ,因此,只有当m <= n ,递归调用才有效。

考虑一串电话,每个电话将n减少1,而m保持固定。 n == m + 3为找出发生的情况:第一个呼叫得到m + 2 ,第二m + 1 ,第三m ,并返回m 第二个取n == m + 1乘以第三个返回的m ,第二个取n == m + 2并乘以先前的结果,最后结果为(m + 3) * (m + 2) * (m + 1) * m 此函数计算n! / (m - 1)! n! / (m - 1)! 如果n >= m 知道这是怎么回事,很容易检查我们(到目前为止)的预感是否正确。

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;
}

这是阶乘函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM