public class Test{
public static int getResult(int parameter) {
if (parameter == 0) { return result; } else { result *= parameter; return recursiveFunction(parameter - 1, result); }
return number;
}
public static void main(String[] args) { // 在這裡寫你的程式碼 }
int result = result(5);
System.out.println(result);
}
}
它的執行原理是如下這樣的:
result(5) 初始時,進入函數體判斷parameter是否小於等於1,此時parameter等於5,條件不成立,執行parameter*result(parameter-1),即5 * result(5-1),程序反覆執行...
5*result(5-1)
4*result(4-1)
3*result(3-1)
2 * result(2 - 1) 到此 parameter 等於 1 符合條件,函數傳回 1,層層傳回。即:
result(1) =1
2*result(1)=2*1=2
3*result(2)=3*2=6
4*result(3)=4*6=24
5*result(4)=5*24=120
程式如下所示,輸入格式為:
5
3 1 2 1 2的意思是,第一行是一個數字,表示接下來要輸入的數字個數。第二行有n個數,表示待排列的數,輸入假設待排序的數均為非負數。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static final int maxn = 1000;
int n; // 陣列元素個數
int[] a; // 陣列
boolean[] used; // 輔助變量,在遞歸過程中標記元素是否已被使用,used[i]表示第i個元素是否已使用
int[] cur; // 儲存目前的排列數
// 遞歸列印無重複全排列,目前列印到第idx位元
void print_comb(int idx) {
如果 idx == n,表示目前已經遍歷到了最後一個元素,可以將cur輸出。
for(int i = 0; i
if(i > 0) System.out.print(" ");
System.out.print(cur[i]);
}
System.out.println();
}
int last = -1; // 為了避免重複,使用last變數來記錄上一次搜尋的值
for(int i = 0; i
if(used[i]) continue;
if(last == -1 || a[i] != last) { // 只有噹噹前數字不重複且未被使用過時,才繼續遞歸下去
last = a[i];
cur[idx] = a[i];
// 回溯法
used[i] = true;
print_comb(idx 1);
used[i] = false;
#}
}
}
public void go() throws FileNotFoundException { // 實作方法體 }
{
Scanner in = new Scanner(new File("data.in"));的語法是建立一個名為in的Scanner對象,用於從名為data.in的檔案中讀取輸入。
// 讀取資料並排序
n = in.nextInt();
a = new int[n];
for (int i = 0; i
Arrays.sort(a);
// 初始化輔助變數並開始無重複全排列
cur = new int[n];
used = new boolean[n];
for(int i = 0; i
print_comb(0);
in.close();
}
public static void main(String[] args) throws FileNotFoundException { 這是一個Java程式中的主方法,用來啟動程式的入口。在這個方法中,我們可以執行一些操作,例如讀取文件,處理資料等。 其中,throws FileNotFoundException 表示執行過程中可能會出現檔案找不到的異常,如果出現了這個異常,程式將會拋出 FileNotFoundException 例外。 在這個方法中,你可以寫特定的程式碼邏輯,處理檔案的讀取和異常的處理。
new Main().go();
}
}客觀來說,非遞歸的無重複全排列比較簡單且有效率。
你的兩個問題其實是一個問題,對吧。
遞歸的作用:遞歸演算法可以解決一些透過遞歸定義的題目。
首先,我們要先理解什麼是遞歸定義的問題。簡單來說,遞歸定義的問題是指一個大問題中包含了與其結構相同但規模較小的小問題。
例如n階乘的定義可以理解為:
n!= n*(n-1)!
從上述分析不難得出,(n-1)! 是比 n! 規模更小的問題。按照此方法不斷將問題分解下去,我們可以得到一些基本已知的數據。然後,透過反向推導,我們就能得到最終的結果。
n的階乘演算法如下:
private static int jieCheng(int n) { 這是一個計算階乘的方法,其中參數n表示要計算階乘的數值。以下是具體的解釋: - "private"表示方法僅在目前類別中可見,其他類別無法存取。 - "static"表示方法是靜態方法,可以直接透過類別名稱調用,而不需要實例化物件。 - "int"表示方法傳回一個整數值作為結果。 - "jieCheng"是方法的名稱,可以根據需要進行命名。
if(n == 1)
return 1;
else {
return n*jieCheng(n-1);
}
}
此外,二元樹的定義也是遞歸的,這意味著許多二元樹的操作都是透過遞歸來實現的。
用遞迴會使程式相當簡潔。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
publicclassTest {
publicstaticintf(intn){
#if(n==20){
return1;
}elseif(n==21){
return4;
}elseif(n
returnf(n 2)-2*f(n 1);
}else{
return2*f(n-1) f(n-2);
}
}
public static void main(String[] args) {
System.out.println(f(10)); //印出f(10)的值
}
}
已經經過測試,在main函數中輸入f(n),其中n為手動調整的參數,即可獲得對應的輸出結果。
以上是請問大家java中遞歸演算法希望有詳細解釋的詳細內容。更多資訊請關注PHP中文網其他相關文章!