2017-09-06 40 views
0

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

例如如果我的输入值是20,它应该显示

其中

  • 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>"); 
} 

注:环只有一个变量和一个是必需的,它不会,如果我们使用的功能或数组接受。请帮助我,这是我在PHP中遇到的最困难的问题之一..

回答

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

0

既然你提到只有一个可变的,并且一个用于环路需要

尝试此,

$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

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的情况下]。

在其他情况下,第二个值是循环重复,并加起来以前的值。

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的等效(使用for循环您期望的风格):

$限制= 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语句!

相关问题