java - 如何从x个连续数字递归计算可能增加的序列数?
问题描述
令 integerx
为数字组合的长度,并且有一个从 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
计数。
我会把实际的编码留给你。
推荐阅读
- javascript - 用 Jest 测试覆盖 console.log
- perl - perl:将一个数组复制到另一个(多维)
- javascript - 从 onFocus 事件中检索 TextInput 的屏幕坐标
- blockchain - 投标人从钱包中提取时的智能合约(Solidity)拍卖
- javascript - javascript 并不总是以正确的顺序触发,有时会中断
- amazon-web-services - AWS cognito 公钥证书
- python - 尝试使用 Torch/PyTorch 创建 docker 映像时出现 MemoryError
- c# - 在 Azure 媒体服务中编码不同的纵横比
- php - WordPress 在 wp_die 之后发布帖子
- javascript - 用 JS 切换页面颜色