遞歸演算法實例
① 10道pascal的遞歸習題,簡單一點啊
1. 有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第1個人大2歲。最後問第1個人,他說是10歲。請問第5個人多大。顯然,這是一個遞歸問題。要求第5個人的年齡,就必須先知道第4個人的年齡,而第4個人的年齡也不知道,要求第4個人的年齡必須先知道第3個人的年齡,而第3個人的年齡又取決於第2個人的年齡,第2個人的年齡取決於第1個人的年齡。而且每一個人的年齡都比其前1個人的年齡大2。
2.用遞歸方法求n!
3.用遞歸方法求斐波那契數列
4.有1*n的一個長方形,用一個1*1、1*2、1*3的骨牌鋪滿方格。例如當n=3時為1*3的方格。此時用1*1,1*2,1*3的骨牌鋪滿方格,共有四種鋪法。圖4.4.3列出了四種鋪法。
5.設s是一個具有n個元素的集合s={a1,a2,…an},現將s集合劃分成k個滿足下列條件的子集合s1,s2,s3。。。。;
1、si<>空;
2、si∩sj=空;
3、s1∪s2∪s3…. ∪sn=s (1<=i,j<=k,i<>j)
則稱s1,s2…sn是集合s的一個劃分,它相當於把集合s中的n個元素放入k個無標號的盒子中,使得沒有一個盒子為空,試確定n個元素的集合放入k個無標號盒的劃分數s(n,k)
6.設有一個背包,可以放入的重量為s。現有n件物品,重量分別為t1 , t2 , t3 … ti … tn ,ti (1≤ i≤n),均為正整數。從n件物品中挑選若干件,使得放入背包的重量之和正好為s
【輸入樣例】 【輸出樣例】
the number of object:5 number:1 weight:1
total weight=10 number:3 weight: 2
1 6 2 7 5 number:4 weight:7
7.輸出n個元素的無重復的全排列。N個元素有n!種不同排列
8.任何一個正整數都可以用2的冪次方表示.例如:137=2^7+2^3+2^0。同時約定次方用括弧來表示,即a^b可表示為a(b)。由此可知,137可表示為:2(7)+2(3)+2(0),進一步:7=2^2+2+2^0 (2^1用2表示);3=2+2^0;所以最後137可表示為:2(2(2)+2+2(0))+2(2+2(0))+2(0)。又如:1315=2^10+2^8+2^5+2+1;所以1315最後可表示:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
輸入:正整數(n≤20000)
輸出:符合約定的n的0,2表示(在表示中不能有空格)
9.。一個正整數的數字的乘積N的定義是:這個整數中非零數字的乘積。例如,整數999的數字乘積為9*9*9,即729。729的數字乘積為7*2*9,即126。126的數字乘積為1*2*6,即12。12的數字乘積為1*2,即2。一個正整數的數字乘積根N是這樣得到的:反復取該整數的數字乘積,直到得到一位數字為止。例如,在上面的例子中數字的乘積根是2。
編寫一個程序,輸入一個正整數(長度不超過200位數字),輸出計算其數字乘積根的每一步結果。
10.輸入N個字元,然後以倒序輸出(用遞歸實現)
階乘:
要求:給定一個數值,計算出它的階乘值,例如5的階乘為5*4*3*2*1
實現:
[html] view plain
<span style="font-size:12px;"> // 利用遞歸實現一個數的階乘值 private static BigDecimal getNum(BigDecimal inNum) { if (inNum.compareTo(BigDecimal.ONE) == 0) { return inNum; } return inNum.multiply(getNum(inNum.subtract(BigDecimal.ONE))); }</span>
(2)Fibonacci數列:1,1,2,3,5,8,13……
要求:找出數列中指定index位置的數值
實現:
[html] view plain
<span style="font-size:12px;"> // 利用遞歸實現了Fibonacci數列 private static int fab(int index) { if (index == 1 || index == 2) { return 1; } else { return fab(index - 1) + fab(index - 2); } }</span>
(3)漢諾塔
要求:漢諾塔挪動
實現:
[html] view plain
<span style="font-size:12px;"> <span style="white-space:pre;"> </span>private static final String DISK_B = "diskB"; <span style="white-space:pre;"> </span>private static final String DISK_C = "diskC"; <span style="white-space:pre;"> </span>private static final String DISK_A = "diskA"; <span style="white-space:pre;"> </span>static String from=DISK_A; <span style="white-space:pre;"> </span> static String to=DISK_C; <span style="white-space:pre;"> </span> static String mid=DISK_B; <span style="white-space:pre;"> </span> public static void main(String[] args) { <span style="white-space:pre;"> </span> String input=JOptionPane.showInputDialog("please input the number of the disks you want me move."); <span style="white-space:pre;"> </span> int num=Integer.parseInt(input); <span style="white-space:pre;"> </span> move(num,from,mid,to); <span style="white-space:pre;"> </span> }</span>
[html] view plain
<span style="font-size:12px;"> // 利用遞歸實現漢諾塔 private static void move(int num, String from2, String mid2, String to2) { if (num == 1) { System.out.println("move disk 1 from " + from2 + " to " + to2); } else { move(num - 1, from2, to2, mid2); System.out.println("move disk " + num + " from " + from2 + " to " + to2); move(num - 1, mid2, from2, to2); } }</span>
(4)排列組合
要求:將輸入的一個字元串中的所有元素進行排序並輸出,例如:你給出的參數是"abc",
則程序會輸出
abc
acb
bac
bca
cab
cba
實現:
[html] view plain
<span style="font-size:12px;"><span style="white-space:pre;"> </span>public static void permute(String str) { <span style="white-space:pre;"> </span> char[] strArray = str.toCharArray(); <span style="white-space:pre;"> </span> permute(strArray, 0, strArray.length - 1); <span style="white-space:pre;"> </span>}</span>
[html] view plain
<span style="font-size:12px;"> // 利用遞歸實現,將輸入的一個字元串中的所有元素進行排序並輸出 public static void permute(char[] list, int low, int high) { int i; if (low == high) { String cout = ""; for (i = 0; i <= high; i++) { cout += list[i]; } System.out.println(cout); } else { for (i = low; i <= high; i++) { char temp = list[low]; list[low] = list[i]; list[i] = temp; permute(list, low + 1, high); temp = list[low];
③ 易語言遞歸演算法怎麼用,求高手給舉個簡單點的例子
遞歸,簡單說是子程序自己調用自己。
例子:
.版本 2
.子程序 左右查找
.參數 左邊值, 整數型
.參數 右邊值, 整數型
.參數 查找數組, , 數組
.參數 ww, , 參考 可空 數組
.局部變數 i, 整數型
.局部變數 j, 整數型
.局部變數 中間值, 整數型
.如果真 (左邊值 ≥ 右邊值)
返回 ()
.如果真結束
i = 左邊值
j = 右邊值
.判斷循環首 (j ≠ i)
.判斷循環首 (查找數組 [左邊值] ≤ 查找數組 [j] 且 i < j)
j = j - 1
.判斷循環尾 ()
.判斷循環首 (查找數組 [左邊值] ≥ 查找數組 [i] 且 i < j)
i = i + 1
.判斷循環尾 ()
.如果真 (i < j)
中間值 = 查找數組 [j]
查找數組 [j] = 查找數組 [i]
查找數組 [i] = 中間值
.如果真結束
.判斷循環尾 ()
中間值 = 查找數組 [左邊值]
查找數組 [左邊值] = 查找數組 [i]
查找數組 [i] = 中間值
左右查找 (左邊值, i - 1, 查找數組, ) ' 繼續處理左邊的,這里是個遞歸的過程
左右查找 (i + 1, 右邊值, 查找數組, ) ' 繼續處理右邊的,這里是個遞歸的過程
ww = 查找數組
' 以上是快速排序的代碼實現,核心所在是遞歸的過程。
④ python遞歸演算法經典實例有哪些
程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種演算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法。
它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。
遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
Python
是完全面向對象的語言。函數、模塊、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強源代碼的復用性。Python支持重載運算符和動態類型。相對於Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標准庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
⑤ C語言迭代與遞歸比較(舉例)
我舉個例子:
①斐波那契數列:1,1,2,3,5,8,13,21,34......
迭代:int Fib[N];
Fib[0]=1;Fib[1]=1;
for(i=2;i<N;i++)
Fib[i]=Fib[i-1]+Fib[i-2];
}
遞歸:int Fib(int n)
{ if(n==0||n==1)return 1;
else return (Fib(n-1)+Fib(n-2));
}