Java 递归 - 我这样做对吗?

标签 java recursion

<分区>

我的工作是为此方法编写一个递归版本。据我了解,递归是从一个基本调用开始(如果有则返回),然后是一个 else,它展开回原始基础。就像从一副牌开始,添加到牌组,然后从牌组中取出牌,直到你回到原来的牌组。 考虑到这一点,它就在这里。

public static long fact(int n)
{
    long result = 1;
    while(n > 0)
    {
         result = result * n;
         n = n - 1;
    }

    return result;
}

//我的递归版本:

public static void recFact(int n)
{
    if(n==0)
    {
        return n; // ir 0 it really doesn't matter right?
    }
    else
    {
        return recFact(n-1);
    }
}

这只是我即将参加的考试的示例测试问题,只是想确保我掌握了递归。我这样做对吗?如果不是,我错过了什么?请不要回答问题,只是告诉我我做错了什么,也许还有一些更好的理解方法的建议。

谢谢。

最佳答案

不,这个递归解是不正确的。

对于每个正的 n,您只需返回 rectFact(n-1),它将追索直到您到达 0,在它会返回哪一点。换句话说,您的函数将始终返回 0。您遗漏了将当前 nrectFact(n-1) 相乘 的部分。此外,请注意 0! 是 1,而不是 0:

public static int recFact(int n)
{
    if(n==0)
    {
        return 1;
    }
    else
    {
        return n * recFact(n-1);
    }
}

最后,由于 if 子句返回,else 有点多余。当然,这不会影响方法的正确性,但恕我直言,没有它代码看起来更干净:

public static int recFact(int n)
{
    if(n==0)
    {
        return 1;
    }
    return n * recFact(n-1);
}

关于Java 递归 - 我这样做对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24111228/

相关文章:

java - Java项目中的build.xml

java - JSF中 "component"的定义是什么

java - Hibernate 不提交数据

recursion - "recursion"、 "a non-terminating procedure that happens to refer to itself"和 "repeated scheduling"之间有什么区别?

java - 递归计算树中的特殊节点

Tomcat 7 无法启动

java - 单击按钮时如何从 CheckboxTableViewer 中删除选定的行(多行)? (表连接到oracle数据库)

python - 是否可以强制 cPickle 使用广度优先而不是深度优先递归?

c++ - 静态变量在递归中的行为

java - next 无法解析为 java 中的值或字段