算法學習——遞推之擺動數列


算法描述

已知遞推數列:

a(1)=1

a(2i)=a(i)+1

a(2i+1)=a(i)+a(i+1) (i為正整數)

求該數列的第n項,以及前n項中的最大值為多少,其n為多少?

算法思路

  1. 采用遞推的方法,使用一維數組,從2開始遞推,一直遞推到n

    a(i)=a(i/2)+1(n為偶數)

    a(i)=a((i+1)/2)+((i-1)/2) (n為奇數)

    我們只需要使用一個是否被2整除來判斷n是偶數還是奇數,從而選擇相對應的遞推公式

  2. 查找最大值也容易,設置一個變量,只需要遍歷該數組,遇到比變量大的就把該數值賦值給該變量

  3. 最大值所對應的項可能不止一個,所以我們找到一個就把該項數(數組的下標)打印出來

算法實現

	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);

結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM