2017-07-10 5 views
1

私は有限の量のトリボアッチ系列を印刷しようとしています(どの項の値も、前の3つの項の合計、すなわち[2,3,5,10,18,33 ...])ユーザー入力から得られたシード値。以下に示すように0と1以外のその他のいかなる正の値を使用して、コードは常に、作品:シードとしてこのアルゴリズムは、0と1以外のすべてのシードに対してフィボナッチ/トリボカッチシーケンスを印刷するのはなぜですか?

2 
3 
5 
Printing... 
[2, 3, 5, 10, 18, 33, 61, 112, 206, 379, 697, 1282, 2358, 4337, 7977, 14672, 26986, 49635, 91293, 167914] 
Process finished with exit code 0 

しかし、0、1、および1を、私が取得:ここ

0 
1 
1 
Printing... 
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
Process finished with exit code 0 

されますコード(私は過度に明示的なコメントは承知している、それが理由です):

import java.util.Arrays; 
import java.util.Scanner; 

public class Tribonacci { 

public static void main(String[] args) throws InterruptedException { 
    System.out.printf("Hello!\n"); 
    Thread.sleep(2000); 
    System.out.printf("The purpose of this program is to display the first twenty terms of either a Fibonacci sequence or a Tribonacci sequence\n"); 
    System.out.printf("To start, type \"F\" for Fibonacci or \"T\" for Tribonacci:\n");//Give prompt options 
    Scanner seqeuence = new Scanner(System.in); 
    String typeseq = seqeuence.next();//get user input, based on^prompt^
    printSequence(typeseq); 
} 

private static void printSequence(String typeOfSequence) throws InterruptedException { 


    //checks for which kind of sequence they want to print based on above prompt 
    switch (typeOfSequence) { 
     case "T"://if user types "T" 

      System.out.printf("You have chosen to print the first twenty terms of the Tribonacci sequence\n"); 
      Thread.sleep(2000); 
      System.out.printf("We will need the seed terms for this to work, so input THREE non-negative integers, in numerical order:\n"); 
      Scanner getTrib = new Scanner(System.in); 
      int[] tSeeds = new int[3];//scans for three seeds from the user, stores in an array of size 3 

      //put each seed term into an array, in order to perform arithmetic on the elements later 
      for (int i = 0; i < tSeeds.length; i++) { 
       tSeeds[i] = getTrib.nextInt(); 
      } 

      int[] newTSeq = new int[20];//final array to be printed 
      newTSeq[0] = tSeeds[0]; 
      newTSeq[1] = tSeeds[1]; 
      newTSeq[2] = tSeeds[2]; 
      int incrementT = 0;//used to traverse the array and move which seeds should be summed 
      for (int itemT : newTSeq) { 

       if (itemT == tSeeds[0] || itemT == tSeeds[1] || itemT == tSeeds[2]) { 
        continue; 

       } else { 
        newTSeq[3 + incrementT] = newTSeq[incrementT] + newTSeq[incrementT + 1] + newTSeq[incrementT + 2]; 
        ++ incrementT; 
       } 
      } 

      System.out.printf("Printing...\n"); 
      Thread.sleep(2000); 
      System.out.print(Arrays.toString(newTSeq));//terms are converted into strings to be printed 

      break; 

     case "F"://if user types "F" 

      System.out.printf("You have chosen to print the first twenty terms of the Fibonacci sequence\n"); 
      Thread.sleep(2000); 
      System.out.printf("We will need the seed terms for this to work, so input TWO non-negative integers, in numerical order:\n"); 
      Scanner getFib = new Scanner(System.in); 
      int[] fSeeds = new int[2];//scan user input of TWO integers into an array that holds TWO integers 

      //put each seed term into array for later computation, like above 
      for (int i = 0; i < fSeeds.length; i++) { 
       fSeeds[i] = getFib.nextInt(); 
      } 

      int[] newFSeq = new int[20];//final array to be printed 
      newFSeq[0] = fSeeds[0]; 
      newFSeq[1] = fSeeds[1]; 
      int incrementF = 0; 
      for (int itemF : newFSeq) { 
       if (itemF == newFSeq[0] || itemF == newFSeq[1]) { //if the iterator is on one of the seeds, don't sum 
        continue; 
       } else { 
        newFSeq[2 + incrementF] = newFSeq[incrementF] + newFSeq[incrementF + 1];//sums the two preceding terms 
        incrementF++; 
       } 
      } 

      System.out.printf("Printing...\n"); 
      Thread.sleep(2000); 
      System.out.print(Arrays.toString(newFSeq));//convert all array values to strings, to be printed 

      break; 

     default://if neither case is satisfied, print this message 
      System.out.printf("Restart the program. Next time, input the SUGGESTED prompt items \"F\" for Fibonacci or \"T\" for Tribonacci"); 
    } 
} 
} 
+2

と、 '。今問題は、なぜあなたはそのラインをそこに置いたのですか? –

+1

あなたは 'for'ループを複雑にしました。 3で始まり、最後に行くカウンターで普通の 'for 'を使うだけです。 – v010dya

+0

@ v010dyaありがとうございました。私はそのような複雑な解決方法をどう決めたのか分かりません。よく働く。 –

答えて

1

さて、あなたはこの奇妙な状態

を持っています tSeeds[0]tSeeds[1]または tSeeds[2]のいずれかが newTSeqのすべての要素に対してデフォルトで 0である0( itemT以降であれば、あなたが newTSeq配列には何も割り当てないことを意味し、0,1,1の場合は

ループの前にnewTSeq[1]newTSeq[2]1と入力するだけです)。

この状態がどうなっているのかわかりません。おそらくそれを削除することができます。

-1

ちょうど次のコードを置き換える: - `IF(itemT == tSeeds [0] || itemT == tSeeds [1] || itemT == tSeeds [2])ので{続ける

int[] newTSeq = new int[20];//final array to be printed 
Arrays.fill(newTSeq, -1); 
newTSeq[0] = tSeeds[0]; 
newTSeq[1] = tSeeds[1]; 
newTSeq[2] = tSeeds[2]; 
関連する問題