首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Recursion -我做得对吗?

Java Recursion -我做得对吗?
EN

Stack Overflow用户
提问于 2014-06-08 21:53:27
回答 6查看 111关注 0票数 1

我的工作是为这个方法编写一个递归版本。据我所知,递归是从一个基本调用(如果有什么东西,那么返回)开始,然后是另一个调用,它将返回到原来的基。就像从一个甲板开始,添加到甲板上,然后从甲板上移出卡片,直到你回到原来的甲板。考虑到这一点,这里就是。

代码语言:javascript
运行
复制
public static long fact(int n)
{
    long result = 1;
    while(n > 0)
    {
         result = result * n;
         n = n - 1;
    }

    return result;
}

//我的递归版本:

代码语言:javascript
运行
复制
public static void recFact(int n)
{
    if(n==0)
    {
        return n; // ir 0 it really doesn't matter right?
    }
    else
    {
        return recFact(n-1);
    }
}

这只是我即将进行的考试的一个例子测试问题,只是想确保我有一个递归的处理方法。我做得对吗?如果不是的话,我错过了什么?请不要回答任何问题,只要告诉我我做错了什么,也许还有一些更好的理解方法的建议。

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-06-08 22:01:11

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

对于每一个正的n,您只是返回rectFact(n-1),这将追索权直到您到达0,此时它将返回。换句话说,函数将始终返回0。您忽略了将当前nrectFact(n-1)相乘的部分。另外,注意0!是1,而不是0:

代码语言:javascript
运行
复制
public static int recFact(int n)
{
    if(n==0)
    {
        return 1;
    }
    else
    {
        return n * recFact(n-1);
    }
}

最后,由于if子句返回,所以else有点多余。当然,这不会影响方法的正确性,但是IMHO --如果没有它,代码看起来会更干净:

代码语言:javascript
运行
复制
public static int recFact(int n)
{
    if(n==0)
    {
        return 1;
    }
    return n * recFact(n-1);
}
票数 3
EN

Stack Overflow用户

发布于 2014-06-08 22:00:49

您的递归版本不需要乘法,它将对任何输入返回零。所以不,你做得不对。

但是,递归版本确实是递归的,所以您可以使用递归版本!要了解出了什么问题,就先看看一个非常简单的案例。

客户端调用recFact(3)

这将返回到客户端recFact(2)

将返回到上面的recFact(1)

将返回到上面的recFact(0)

它将返回到上面的0

有两件事出了问题:

  • 你的大小写是错误的(零太低了)
  • 你不能做任何乘法

好的态度,不想要的解决办法交给你!希望这些指点能帮你解决问题。

编辑:很明显,我误解了你的语法,而你确实想要解决办法。

票数 3
EN

Stack Overflow用户

发布于 2014-06-08 22:05:57

任何递归函数都需要三件事:

  1. 终止条件:这告诉函数什么时候停止调用自己。这对于避免无限递归和避免堆栈溢出异常非常重要。
  2. 实际处理:您需要在每个函数中运行实际处理。在非递归的情况下,这是result = result * n--这是您的递归版本中缺少的!
  3. 收集器/agggregator变量:您需要某种方式来存储下面递归调用的部分结果。因此,您需要一些方法来返回recFact的结果,这样您就可以将它包含在调用链的更高层处理中。请注意,您说的是return recFact(n - 1),但在定义中,recFact返回void。那可能是一个int
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24111228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档