我目前在学校学习递归,当有许多递归调用时,我很难思考方法。我只想问你应该如何看待递归,因为我知道跟踪每一步的方法调用会变得太单调乏味。
不是跟踪每个递归调用,我们简要介绍的是通过归纳来思考递归,但我遇到的问题是如何将归纳应用于数学以外的情况。例如,如果有一个方法可以像这样递归地打印数字:
public void blah(int n)
{
for (int i = 0; i < n; i++)
blah(i);
System.out.print(n);
}我很难思考打印出来的是什么,我也看不出归纳在这里有什么关系(如果它可以在任何地方使用,请原谅我的无知)。
但我想我真正的问题是,如何在不跟踪每个方法调用的情况下处理递归?最好的做法是仅仅看到基本情况并向后工作吗?(但即使这样,我想我对发生的事情也会变得模糊)。
发布于 2012-03-28 09:00:17
如何处理递归而不必跟踪每个方法调用?
有几种“理解”递归程序的方法--一种是将递归调用看作一个黑盒,另一种则需要“演绎”几种情况并猜测其模式。
第一个方法假设递归方法已经编写,并且它做了一些已知的事情。当您想到递归下降解析器时,这很有用;它对于生成输出(与消耗输入相反)的程序来说并不是那么好,比如您的程序。
第二种方法更适用于与您的示例类似的程序。对值0、1、2和3进行播放。
0 - 0
1 - 0 1
2 - 0 0 1 2
3 - 0 0 1 0 0 1 2 3你注意到这个模式了吗?N的输出列出了N-1之前项目的输出,并在最后打印N。一旦你认为你可以继续这个模式,你就知道你已经理解了你的递归程序。
发布于 2012-03-28 08:49:18
您可以找到关于在here上进行递归思考的一个很好的解释
从链接
为递归function.
局部变量的问题(例如,.ASSUME()示例中的小问题)
问题也会被错误地计算,因此,假设
上一步将失败)。
发布于 2012-03-28 08:58:04
下面是我对递归的看法。实际上,这很简单。
以经典的递归问题为例: F(n) = n!0!定义为1,任何大于0的值都定义为n*F(n-1)
在这个例子中,我满足了我的两个条件-当我达到0!时停止,并且我将我拥有的任何值乘以第(n-1)个值。
我使用的另一种方法是:如果它可以递归完成,那么它就可以迭代完成。这就是说,如果我可以编写一个循环来执行相同的任务,那么我也可以编写一个递归方法来执行该任务。递归地考虑某些问题通常更容易(例如Ackermann's Function),而其他问题则更容易迭代(例如遍历链表)。
您可能希望在最适合您的地方使用迭代。
https://stackoverflow.com/questions/9899657
复制相似问题