繁体   English   中英

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

[英]How to recursively count the number of possible increasing sequences from x consecutive numbers?

令 integer 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)来弥补这种情况,但这仍然不会产生预期的结果。 我究竟做错了什么?

我像这样从main调用这个方法howManySorted(n, max, 1, 1)

假设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作为计数。

我会把实际的编码留给你。

public static int howManySorted(int n, int max)
{
    return howManySorted(n, 1, max);
}

private static int howManySorted(int n, int min, int max)
{
    if (n == 1)
       return max - min + 1;
    if (min == max)
       return 1;
    return howManySorted(n, min + 1, max) + howManySorted(n-1, min, max);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM