演算法學習——遞推演算法之擺動數列
阿新 • • 發佈:2018-11-07
演算法描述
已知遞推數列:
a(1)=1
a(2i)=a(i)+1
a(2i+1)=a(i)+a(i+1) (i為正整數)
求該數列的第n項,以及前n項中的最大值為多少,其n為多少?
演算法思路
採用遞推的方法,使用一維陣列,從2開始遞推,一直遞推到n
a(i)=a(i/2)+1(n為偶數)
a(i)=a((i+1)/2)+((i-1)/2) (n為奇數)
我們只需要使用一個是否被2整除來判斷n是偶數還是奇數,從而選擇相對應的遞推公式
查詢最大值也容易,設定一個變數,只需要遍歷該陣列,遇到比變數大的就把該數值賦值給該變數
最大值所對應的項可能不止一個,所以我們找到一個就把該項數(陣列的下標)打印出來
演算法實現
System.out.println("請輸入n:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.close(); int[] a = new int[n+1];//從1開始,所以n+1 a[1]=1;//初始條件 //分條件進行正向遞推 for(int i=2;i<=n;i++){ if(i%2==0){ a[i] = a[i/2]+1; }else{ a[i] = a[(i+1)/2]+a[(i-1)/2]; } } System.out.println("a("+n+")為"+a[n]); //遍歷整個陣列,找到最大值 int max = 0; for(int i=1;i<=n;i++){ if(max<a[i]){ max = a[i]; } } //遍歷陣列,找到與最大值相等的數,將該下標(項數)打印出來 for(int i=1;i<=n;i++){ if(max==a[i]){ System.out.print("a("+i+")="); } } System.out.print(max);