2017-09-06 151 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語句!