![](/img/trans.png)
[英]How do you recursively count the number of negative numbers in an array (Java)?
[英]How to recursively count the number of possible increasing sequences from x consecutive numbers?
令 integer 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)
。
假设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
作为计数。
我会把实际的编码留给你。
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.