首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >您应该如何处理递归?

您应该如何处理递归?
EN

Stack Overflow用户
提问于 2012-03-28 08:39:28
回答 6查看 5.7K关注 0票数 10

我目前在学校学习递归,当有许多递归调用时,我很难思考方法。我只想问你应该如何看待递归,因为我知道跟踪每一步的方法调用会变得太单调乏味。

不是跟踪每个递归调用,我们简要介绍的是通过归纳来思考递归,但我遇到的问题是如何将归纳应用于数学以外的情况。例如,如果有一个方法可以像这样递归地打印数字:

代码语言:javascript
运行
复制
public void blah(int n)
{
    for (int i = 0; i < n; i++)
      blah(i);
    System.out.print(n);
}

我很难思考打印出来的是什么,我也看不出归纳在这里有什么关系(如果它可以在任何地方使用,请原谅我的无知)。

但我想我真正的问题是,如何在不跟踪每个方法调用的情况下处理递归?最好的做法是仅仅看到基本情况并向后工作吗?(但即使这样,我想我对发生的事情也会变得模糊)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-03-28 09:00:17

如何处理递归而不必跟踪每个方法调用?

有几种“理解”递归程序的方法--一种是将递归调用看作一个黑盒,另一种则需要“演绎”几种情况并猜测其模式。

第一个方法假设递归方法已经编写,并且它做了一些已知的事情。当您想到递归下降解析器时,这很有用;它对于生成输出(与消耗输入相反)的程序来说并不是那么好,比如您的程序。

第二种方法更适用于与您的示例类似的程序。对值0、1、2和3进行播放。

代码语言:javascript
运行
复制
0 - 0
1 - 0 1
2 - 0 0 1 2
3 - 0 0 1 0 0 1 2 3

你注意到这个模式了吗?N的输出列出了N-1之前项目的输出,并在最后打印N。一旦你认为你可以继续这个模式,你就知道你已经理解了你的递归程序。

票数 4
EN

Stack Overflow用户

发布于 2012-03-28 08:49:18

您可以找到关于在here上进行递归思考的一个很好的解释

从链接

为递归function.

  • Write写一个原型,一个注释,描述什么函数does.

  • Determine基本情况(可能有多个),以及它的solution(s).

  • Determine什么小问题(或多个问题)要解决。如果这使您更容易理解,请将解决方案保存到较小的

局部变量的问题(例如,.ASSUME()示例中的小问题)

  • 使用较小问题的解决方案来解决较大问题。(如果此操作不正确,则较小的

问题也会被错误地计算,因此,假设

上一步将失败)。

票数 5
EN

Stack Overflow用户

发布于 2012-03-28 08:58:04

下面是我对递归的看法。实际上,这很简单。

  • 我需要做什么才能停止?这就是所谓的基础case.
  • What do I do if I not not do?

以经典的递归问题为例: F(n) = n!0!定义为1,任何大于0的值都定义为n*F(n-1)

在这个例子中,我满足了我的两个条件-当我达到0!时停止,并且我将我拥有的任何值乘以第(n-1)个值。

我使用的另一种方法是:如果它可以递归完成,那么它就可以迭代完成。这就是说,如果我可以编写一个循环来执行相同的任务,那么我也可以编写一个递归方法来执行该任务。递归地考虑某些问题通常更容易(例如Ackermann's Function),而其他问题则更容易迭代(例如遍历链表)。

您可能希望在最适合您的地方使用迭代

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9899657

复制
相关文章

相似问题

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