java - 需要帮助理解三步动态编程/递归问题

标签 java algorithm data-structures dynamic-programming

我一直在努力学习/理解更多的动态编程/递归,但我不确定如何理解它为何有效。我正在研究这个

https://www.geeksforgeeks.org/count-ways-reach-nth-stair-using-step-1-2-3/

链接中有解决方案。我理解递归到一定程度,但我不理解程序的结构如何给出你想要的结果。我只是,不明白为什么

return findStep(n - 3) +  
       findStep(n - 2) + 
       findStep(n - 1);   

解决这个问题,或者别人怎么知道它会给你所有的可能性。

代码的内存部分稍后展示,但我只想展示基础知识。

感谢任何帮助,谢谢!

最佳答案

为了那些没有关注您的链接的人的利益,您要解决的问题是通过一次跳上 1、2 或 3 步来找出有多少种不同的爬楼梯方式(任意组合)。

让我们使用符号 f(x) 来表示爬楼梯的可能方式的数量 x 步,并假设你我在 n 级楼梯的底部。您的下一步行动有以下三种选择:

  • 如果您上一级台阶,那么从您的新位置将有f(n-1) 种可能的爬楼梯方式。

  • 如果您上两级台阶,那么将有f(n-2)种可能的方式从您的新位置爬楼梯。

  • 如果您上三级台阶,那么从您的新位置将有f(n-3) 种可能的爬楼梯方式。

如果所有这三个 Action 都是可能的,那么 f(n) 的值必须等于 f( n-1) + f(n-2) + f(n-3) .这是递归算法的基础。您只需提供终点:

  • f(1) = 1(上升 1 步)

  • f(2) = 2(上升 2 步,或 1+1 步)

  • f(3) = 4(上升 3 或 2+1 或 1+2 或 1+1+1 步)

如果愿意,您还可以添加条件 f(0) = 1(即,有一种方式爬楼梯)。您链接到的页面中的代码似乎已将 f(3) 和 f(0) 的结果折叠在一起,但结果是一样的。

由于此递归算法在每次迭代时调用自身 3 次,因此除非您存储 f(x) 的中间值,否则它将运行非常缓慢。这就是动态规划中的记忆化。

关于java - 需要帮助理解三步动态编程/递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57846214/

相关文章:

hashtable - 哈希表vs哈希列表vs哈希树?

java - 具有快速查找功能的排序集(与 HashSet 一样快?)

java - 将 xml 文档中出现的特殊字符(如 – 和 —)替换为相应的代码(如 等)

java - java中使用RC4加密图像

sql - 查询(或算法?)查找从两个不同位置到一个共享位置的最便宜的重叠航类

javascript - NodeJS 中的高效深拷贝

java - 比较对象数组元素中的特定属性

java - 如何在 Android 中以编程方式增加 RAM 使用量?

java - 数据库中已删除对象的 Hibernate 刷新 session

java - 我如何从操纵杆获得角度?