2017-03-08 69 views
0

我现在教自己编程,我来到了一个被引入递归函数的点。我理解他们背后的基本原则,但每当我尝试阅读包含递归函数的代码时,我都会遇到难以追查的问题。老实说,如果我不在纸上写下整个功能并手动跟踪它,我就不能真正理解它的功能,我不能在心理上跟随它,就是我所说的。你能提供一些关于如何在精神上做到这一点的提示吗?我非常聪明(智商117),也许这就是问题所在?提前致谢。正确阅读递归函数

+0

递归是一个非常糟糕的工具,使用频率太高。 – DwB

+0

练习,练习,练习。 –

+0

投票重新开放。这是一个关于如何最好地理解递归的有效问题。虽然答案将基于经验知识,但情况往往如此,并不会使问题失效。 – rghome

回答

0

我认为这是一个很好的问题。很多人犯了一个错误,试图按照递归函数的调用栈,这是错误的方法。

我发现唯一的办法是看看写的是什么,并问自己它是否在逻辑上是正确的,它是否会结束。如果这些事情是真的,它就会起作用,而且你不需要知道如何。

的详细信息:

  1. 是否所有可能的输入值考虑?
  2. 这些陈述在每种情况下都是真实的吗?
  3. 有没有(有)值(s)函数不会递归?
  4. 剩余的所有输入值是否最终导致该值?

例如(伪码):

factorial(n): 
    if (n < 0) throw InvalidArgument 
    if (n == 0) return 1 
    else return factorial(n - 1) * n 

所有输入值都包括在内。这些陈述是真实的。有一个值不会递归(< = 0),其余所有值减1,直到达到退出值。因此,它的工作。

你当然可以在你的想法中犯错误。一个好的智商确实对此有所帮助,并且您可能需要在某个时候使用追踪或调试来检查您的假设并在逻辑中找到错误,但这不应该是第一种方法。

这就是递归解决方案的美妙之处:它们倾向于陈述事实而非程序性指示!

+0

谢谢,先生。所以,基本上,我不是那么愚蠢,我只是用错了方法,对吧? –

+0

是的 - 的确如此!在这种情况下要做的聪明的事情是理解算法的基本正确性,而不是尝试和追踪每个执行路径。如果您认为它有价值,请提高答案。 – rghome

0

我认为智商并不重要。无论如何,我认为这都是关于练习。尝试写一些递归函数。经过大量的练习和经验,你会发现它更容易理解。

有一些good ideas。 祝你好运。