【问题标题】:How to get the paths in the recursion call如何在递归调用中获取路径
【发布时间】:2013-10-28 03:55:07
【问题描述】:

一个孩子正在跑上 n 步的楼梯,一次可以走 1 步、2 步或 3 步。现在编写一个程序来计算孩子可以用多少种可能的方式跑楼梯。

解决方案是这样的(DP可以用来节省时间)

public static int countDP(int n) {
 if (n<0)
   return 0;
 else if (n==0)
   return 1;   
 else {
   map[n] = countDP(n-1) + countDP(n-2) + countDP(n-3);
 return map[n]; }
}

现在的问题是如何获得这些路径?例如对于 n=4,此函数返回 7,如何获取所有可能的路径? (在这个例子中 1111 - 121 - 112 - 211 - 31 - 13 - 22 ) 有没有办法通过改变当前程序来做到这一点?

这不是一个家庭作业问题,它来自破解编码面试书的递归和动态编程一章 - 第 9 章 - 问题 1。

【问题讨论】:

  • 这看起来有点像家庭作业问题...
  • 到目前为止你尝试了什么?
  • @IMSoP,我们应该还是不应该回答这样的问题,如果它们看起来很像复制/粘贴到这里的家庭问题?
  • @Roman 这里有提出和回答家庭作业问题的指南:meta.stackexchange.com/questions/10811/…
  • 它来自哪里并不重要(好吧,根据某些人的说法,答案应该不同)。让我改写@IMSoP 的评论 - “这看起来很可疑,就像一个刚刚从某个地方复制的问题,没有表现出任何自己解决问题的尝试,这不适合Stack Overflow”。

标签: algorithm recursion


【解决方案1】:

是的,有一些方法可以找到所有路径,这些路径可以实现到您现有的代码中。 首先,这在空间方面将非常昂贵。即使对于 n=4,您也需要创建 7 个路径。

我认为,最好的方法是创建一个三叉树并分配路径可以到达每个子节点的每种可能方式。 所以,这里是一个简单的伪代码:

root.value = 0;
root.left.value = 1;
root.middle.value = 2
root.right.value = 3;

然后,当您进行递归时,您会将每个孩子传递给适当的递归调用。

您需要处理一些极端情况。 另外,考虑到您正在使用递归,请考虑应该在哪里定义此三叉树。

注意:我不想发布实际代码或给出完整答案,因为有几个人(包括我自己)认为这可能是一个家庭作业问题。正因为如此,我试图帮助解决这个问题并引导这个人找到解决方案,而不仅仅是分发它。

【讨论】:

  • 当您进行递归调用时,您已经在制作一棵树,创建另一棵树看起来并不是最佳答案。我正在寻找一种使用递归树来获取所有路径的方法。这不是家庭作业问题,它来自破解编码面试书的递归和动态编程章节 - 第 9 章 - 问题 1。
  • @user2925218 要查找所有路径,您可以执行一个 DFS 版本,该版本将遍历树中所有可能的组合。一旦你点击一个叶节点 - 打印出(或存储在某处)从根到叶节点的完整路径。这可以为您提供所有路径的列表。链接到 DFS(以防万一):en.wikipedia.org/wiki/Depth-first_search
  • 上面代码中的遍历就像DFS一样,递归的基本条件是叶子(当n=0或n
  • @user2925218 在叶节点创建字符串或使用某些内部保存信息的数据结构将很困难,因为您有递归。要么用迭代代替递归(并使用一些数据结构来存储有关当前步骤的信息),要么创建一个单独的(全局)树,当你走的时候,它会被填满,然后遍历它并获取你的路径。您确实以树状方式遍历代码,但您不存储任何相关信息。换句话说,您没有任何数据结构可以存储您的路径信息。因此,我相信,你需要树!
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
相关资源
最近更新 更多