【发布时间】:2015-10-30 18:56:25
【问题描述】:
我有一个遵循特定逻辑的二进制序列,使得
它以0 和
nth term = (n-1)th term 的序列 + 0 + inverse(reverse(n-1)th term)
例如:
0
0 + 0 + 1
001 + 0 + 011
0010011 + 0 + 0011011
这里,我需要找出第k个序列的第n项。
我的看法:
我写了一个递归函数来计算第 k 个序列中的项数
public static long noOfElements(long elements){
long answer;
if(elements == 1)
return 1;
else
answer = 1 + 2*noOfElements(elements-1);
return answer;
}
经过分析,我发现序列遵循一定的规律,第k个序列可以对半分解,并切换0和1的值,我可以跟踪结果。
所以,我下面的函数将给定的序列递归地分解为 [0,0,1]
public static long letsBegin(long reqd, long length){
long mid = (length + 1)/2;
if(length <= 3){
return reqd;
}else{
if(reqd > mid){
reqd = reqd - 2*(reqd-mid);
switcher(); //Switcher stores if the value is switched
return letsBegin(reqd, mid);
}else{
return letsBegin(reqd, mid);
}
}
}
最后,我在 [0,0,1] 中有索引 1、2 或 3,并相应地输出值。 这里的问题是
- 由于某些未知情况而失败(可能是我的逻辑错误)。
- 序列数最多可达到 50 个,使得元素数 = 1125899906842623,因此输出值需要很长时间(>2 秒) 可能出了什么问题?我的逻辑不正确吗
【问题讨论】: