如何获取递归调用中的路径

时间:2013-10-27 14:29:32

标签: algorithm recursion

一个孩子正在爬楼梯,有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) 有没有办法改变当前的程序?

这不是一个家庭作业问题,它来自Cracking Coding Interview的Recursion and Dynamic Programming一章 - 第9章 - 问题1。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

你需要照顾一些角落案件。 另外,考虑到您正在使用递归,请考虑应该在哪里定义此三元树。

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