数字序列1 2 4

时间:2017-09-06 10:21:11

标签: algorithm loops for-loop sequence fibonacci

我需要帮助提供一个数值序列的算法,该算法应显示一系列1 2 4及其连续的求和。

e.g。如果我的输入值是20,则应显示

  

1 2 4 8 9 11 15 16 18

其中

  • 1 = 1
  • 2 = 1 + 1
  • 4 = 2 + 2
  • 8 = 4 + 4

1和2和4的总和将再次重复,从现在的数字8开始,等等。

  • 9 = 8 + 1
  • 11 = 9 + 2
  • 15 = 11 + 4
  • 16 = 15 + 1
  • 18 = 16 + 2

正如你所看到的,它不应该进入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中遇到的最困难的问题之一..

4 个答案:

答案 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);
}

请参阅online compiler

答案 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;
}

Online Compiler

答案 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语句!