如何从x个连续的数字中递归地计算可能增加的序列的数量?

时间:2018-06-20 16:55:48

标签: java recursion sequence

让整数x为数字组合的长度,并设置从1到max的连续整数范围。序列必须是非递减的(顺序通常是递增的,但是可以使用相同的连续数字)。给定xmax,可能有多少个这样的序列?

例如,对于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);
}
  1. howManySorted(n, max, len + 1, i + 1)是指序列长度加一,而下一个数字比前一个数字大一个的情况。

  2. howManySorted(n, max, len + 1, i)是指序列长度加一,而下一个数字与前一个相同的情况。

我的递归公式确实存在问题,因为在这样的序列中,相邻数字之间的差异最多为1。因此,我决定添加另一个调用howManySorted(n, max, len, i + 1),该调用可以补偿这种情况,但这仍然无法产生预期的结果。我在做什么错了?

我像这样mainhowManySorted(n, max, 1, 1)调用此方法。

1 个答案:

答案 0 :(得分:0)

让我们说len = 10max = 5

请注意,由于我们对实际解决方案不感兴趣,仅对计数感兴趣,范围2-5的结果与范围1-4的结果相同。

对于第一个数字,我们可以选择1-5,然后:

  1. 使用len = 9进行递归调用,将号码范围限制为1-5,即max = 5
  2. 使用len = 9进行递归调用,将号码范围限制为2-5,即max = 4
  3. 使用len = 9进行递归调用,将号码范围限制为3-5,即max = 3
  4. 使用len = 9进行递归调用,将号码范围限制为4-5,即max = 2
  5. 使用len = 9进行递归调用,将号码范围限制为5-5,即max = 1

总结递归调用返回的计数。这是此调用的结果。

len = 1时有max个解决方案,因此返回max作为计数。

max = 1时,只有一个解决方案,而与len无关,因此请返回1作为计数。

我将实际编码留给您。