让整数x
为数字组合的长度,并设置从1到max
的连续整数范围。序列必须是非递减的(顺序通常是递增的,但是可以使用相同的连续数字)。给定x
和max
,可能有多少个这样的序列?
例如,对于x
= 3,max
= 2,存在4个可能的序列:
1,1,1
1,1,2
1,2,2
2,2,2
我想到了以下递归方法:
public static int howManySorted(int n, int max, int len, int i) {
if(len > n || i > max) {
return 0;
}
if(len == n && i == max) {
return 1;
}
return howManySorted(n, max, len + 1, i + 1) +
howManySorted(n, max, len + 1, i) +
howManySorted(n, max, len, i + 1);
}
howManySorted(n, max, len + 1, i + 1)
是指序列长度加一,而下一个数字比前一个数字大一个的情况。
howManySorted(n, max, len + 1, i)
是指序列长度加一,而下一个数字与前一个相同的情况。
我的递归公式确实存在问题,因为在这样的序列中,相邻数字之间的差异最多为1
。因此,我决定添加另一个调用howManySorted(n, max, len, i + 1)
,该调用可以补偿这种情况,但这仍然无法产生预期的结果。我在做什么错了?
我像这样main
从howManySorted(n, max, 1, 1)
调用此方法。
答案 0 :(得分:0)
让我们说len = 10
和max = 5
。
请注意,由于我们对实际解决方案不感兴趣,仅对计数感兴趣,范围2-5的结果与范围1-4的结果相同。
对于第一个数字,我们可以选择1-5,然后:
len = 9
进行递归调用,将号码范围限制为1-5,即max = 5
len = 9
进行递归调用,将号码范围限制为2-5,即max = 4
len = 9
进行递归调用,将号码范围限制为3-5,即max = 3
len = 9
进行递归调用,将号码范围限制为4-5,即max = 2
len = 9
进行递归调用,将号码范围限制为5-5,即max = 1
总结递归调用返回的计数。这是此调用的结果。
当len = 1
时有max
个解决方案,因此返回max
作为计数。
在max = 1
时,只有一个解决方案,而与len
无关,因此请返回1
作为计数。
我将实际编码留给您。