这是我自己尝试解决的递归问题(不是作业)。我相信我找到了解决方案,但我不确定时间复杂度(我知道DP会给我更好的结果)。
给定n个台阶和每次能上k个台阶,找出所有可以上到n个台阶的方法,其中k <= n。例如,如果我的步幅为[1,2,3],而楼梯的大小为10,则我可以走10步,每步为1 [1,1,1,1,1,1,1,1,1,1]=10,或者我可以走3步,每步为3,再走1步,每步为1 [3,3,3,1]=10。
以下是我的解决方案:
我的猜测是,这个运行时间是 k^n,其中 k 是步长的数量,n 是步数(在这种情况下分别为 3 和 10)。
我得出这个答案的原因是,每个步长都有一个循环,调用 k 个步长。然而,所有步长的深度并不相同。例如,序列 [1,1,1,1,1,1,1,1,1,1] 比 [3,3,3,1] 有更多的递归调用,所以这让我对我的答案产生了怀疑。
运行时间是多少?k^n 正确吗?
给定n个台阶和每次能上k个台阶,找出所有可以上到n个台阶的方法,其中k <= n。例如,如果我的步幅为[1,2,3],而楼梯的大小为10,则我可以走10步,每步为1 [1,1,1,1,1,1,1,1,1,1]=10,或者我可以走3步,每步为3,再走1步,每步为1 [3,3,3,1]=10。
以下是我的解决方案:
static List<List<Integer>> problem1Ans = new ArrayList<List<Integer>>();
public static void problem1(int numSteps){
int [] steps = {1,2,3};
problem1_rec(new ArrayList<Integer>(), numSteps, steps);
}
public static void problem1_rec(List<Integer> sequence, int numSteps, int [] steps){
if(problem1_sum_seq(sequence) > numSteps){
return;
}
if(problem1_sum_seq(sequence) == numSteps){
problem1Ans.add(new ArrayList<Integer>(sequence));
return;
}
for(int stepSize : steps){
sequence.add(stepSize);
problem1_rec(sequence, numSteps, steps);
sequence.remove(sequence.size()-1);
}
}
public static int problem1_sum_seq(List<Integer> sequence){
int sum = 0;
for(int i : sequence){
sum += i;
}
return sum;
}
public static void main(String [] args){
problem1(10);
System.out.println(problem1Ans.size());
}
我的猜测是,这个运行时间是 k^n,其中 k 是步长的数量,n 是步数(在这种情况下分别为 3 和 10)。
我得出这个答案的原因是,每个步长都有一个循环,调用 k 个步长。然而,所有步长的深度并不相同。例如,序列 [1,1,1,1,1,1,1,1,1,1] 比 [3,3,3,1] 有更多的递归调用,所以这让我对我的答案产生了怀疑。
运行时间是多少?k^n 正确吗?
n
的值,您都有k
个递归情况,因此您拥有的基本上是一个k
叉树。现在,最短路径是您执行更大步骤的路径,这些步骤是n // k +(n%k)//(k-1)+((n%k)/ /(k-1)%(k-1))+ ...
,直到达到1。现在,该级别以上的所有节点形成一个完整的k
叉树,其中至少有k ^(n // k + ...)个节点。因此,它应该至少接近。 - Bakuriu