递归中正确的思维方式

时间:2018-03-07 19:24:47

标签: java recursion coding-style

今天我只是做了一些递归练习。虽然我可以判断问题是否与递归有关,并最终使它们得到解决。但它通常需要我的时间。因为我必须递归思考。

所以我在这里解释如何解决递归问题

else

}

如果你看一下上面两个在某个位置找到fabonacci数的解决方案。上面给出了两种方法。一个是findFabNumber(),另一个是findLastFabNumber()。 findLastFabNumber()由我编码,其他人通常可以在线使用。 这是我的思考过程。

在Fibonacci系列中,我必须保持两个数字。在第一次调用时,将会传递一个,但是当递归方法被调用时,必须更新数字。因为下一个数字将是最后两个数字的总和。但我必须在某个位置找到斐波纳契数。所以我必须在递归方法调用中传递位置计数器,这将会减少。在那之后,当递减的计数器变为0时,我认为递归地最后一次调用。那一刻我必须返回lastNumber。因此它被编码。但当我在网上看到解决方案。这是以另一种方式给出的(findFabNumber())。它有两个递归调用。但根据概念,它是非常易读的。因为根据概念,最后两个数字的总和将是您的下一个数字。所以我刚刚通过n并直接编码

catch

除了基本情况之外,我没有必须递归思考。这是两个递归调用。同样如果我们想要找到数组的子集数。我们可以通过两次递归方法调用来实现。我们不要以递归的方式深思熟虑。我看到人们在纸上从上到下思考纸张,但我不能认为所有递归问题的树结构。所以我必须以自己的方式思考它是否是递归问题。

您解决像我或任何其他问题的递归问题的思维过程是什么?你是否也以递归的方式思考。

这可能是一个愚蠢的问题,但对我很重要。因为如果想做事的方式是正确的,那么对我们来说事情就很容易了。我通常这么认为。

1 个答案:

答案 0 :(得分:0)

您的findLastFabNumber使用递归函数调用,但它不能递归地解决斐波那契问题。您的解决方案是在递归方法调用中“伪装”问题的迭代解决方案。

要看到的一种方法是你的findLastFabNumber需要额外的参数,如果这些不是斐波纳契的起始条件,你的函数将不会计算第n个斐波纳契数。

对问题的真正递归解决方案可以在较小的范围内解决完全相同的问题。因此,递归思考的正确方法是尝试通过在“较小”范围内解决完全相同的问题来解决问题,然后将差异计算到下一个更高的范围。

  

这是我的思考过程。在Fibonacci系列中,我必须保持两个数字......

这就是问题所在。您必须仅在Fibonacci的迭代解决方案中维护2个数字,但在Fibonacci问题的抽象描述中,您不需要维护两个数字。您首先考虑了迭代解决方案,而不是抽象问题。

另外,顺便说一句。虽然你的解决方案很有创意,但它比使用普通循环的Fibonacci的经典迭代解决方案更糟糕(在可读性和Java等语言中的堆栈使用方面)。