我需要帮助提供一个数值序列的算法,该算法应显示一系列1 2 4及其连续的求和。
e.g。如果我的输入值是20,则应显示
1 2 4 8 9 11 15 16 18
其中
1和2和4的总和将再次重复,从现在的数字8开始,等等。
正如你所看到的,它不应该进入22(18 + 4),因为我们的样本输入值是20.我希望你们明白我的观点。我在for循环中设计算法时遇到了问题。我现在所做的不起作用是
$input = 20;
for ($i = $i; $i < $input; $i = $i+$i) {
if($i==0){
$i = 4;
$i = $i - 3;
}elseif($i % 4 == 0){
$i = $i + 1;
}
print_r("this is \$i = $i<br><br>");
}
注意:只需要一个变量和一个 for loop ,如果我们使用函数或数组,则不会被接受。请帮助我,这是我在PHP中遇到的最困难的问题之一..
答案 0 :(得分:0)
你可以使用代码
$input = 20;
$current = 1;
$val = 1;
while($val < $input){
print_r("this is \$val = $val\n");
$val = $val + $current;
$current = ($current == 4 ? 1 : $current*2);
}
答案 1 :(得分:0)
由于您已经提到只需要一个变量和一个for循环
试试这个,
$input = 20;
for ($i = 1; $i < $input; $i) {
if($i>$input) break;
print_r("this is \$i = $i<br><br>");
$i=$i+1;
if($i>$input) break;
print_r("this is \$i = $i<br><br>");
$i=$i+2;
if($i>$input) break;
print_r("this is \$i = $i<br><br>");
$i=$i+4;
}
答案 2 :(得分:0)
def getSeq(n):
if n == 1:
return [1]
temp = [1]
seq = [ 1, 2, 4]
count, current, prev = 0, 0, 1
while True:
current = prev + seq[count]
if current > n:
break
prev = current
temp += [current]
count = (count + 1) % 3
return temp
print getSeq(20)
我很确定这个会开始工作
我们必须处理的情况是 n == 1 并返回静态结果[1]。
在其他情况下,第二个值循环重复并加起来为先前的值。
答案 3 :(得分:0)
这个Python解决方案应该可以用任何合理的语言实现:
limit = 20
n = 1 << 2
while n >> 2 < limit:
print(n >> 2)
n = (((n >> 2) + (2 ** (n & 3))) << 2) + ((n & 3) + 1) % 3
Perl Equivalent (使用您期望的for
循环样式):
$ limit = 20;
for ($n = 1 << 2; $n >> 2 < $limit; $n = ((($n >> 2) + (2 ** ($n & 3))) << 2) + (($n & 3) + 1) % 3) {
print($n >> 2, "\n");
}
<强>输出强>
1
2
4
8
9
11
15
16
18
<强>说明强>
基本解决方案是:
limit = 20
n = 1
i = 0
while n < limit:
print(n)
n = n + (2 ** i)
i = (i + 1) % 3
但我们需要消除额外的变量i
。由于i
仅循环通过0,1和2,因此我们可以将其存储为两位。因此,我们将n
向上移位两位,并将i
的值存储在n
的低两位,并相应地调整代码。
不仅一个变量和一个for
循环,也没有if
语句!