C++递归算法经典实例详解
生活随笔
收集整理的這篇文章主要介紹了
C++递归算法经典实例详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/*--------------------------- 該段為引用-----------
遞歸算法解決問題的特點:
(1) 遞歸就是在過程或函數(shù)里調(diào)用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結(jié)束條件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設(shè)計程序。
(4) 在遞歸調(diào)用的過程當中系統(tǒng)為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數(shù)過多容易造成棧溢出等。所以一般不提倡用遞歸算法設(shè)計程序。
2.漢諾塔問題
?------------------------------------------------- */
說一下我對遞歸算法的理解。
遞歸算法的代碼,可以分成兩個部分:遞歸出口(滿足輸出條件之類的)和遞歸部分(遞歸代碼的主體)。
遞歸算法特點之一就是把整體換成部分。比如階乘和全排列問題,都是把問題“降階”(待會看代碼就知道什么意思了。)
還有一個最重要的特點————————效率低,但是遞歸算法作為入門級算法還是很值得我這樣的小白研究的。
來看看幾個經(jīng)典的問題。1.全排列 ,2.漢諾塔,3.階乘
1.全排列:給你一個數(shù)組,你把這個數(shù)組里的數(shù)的所有排列方式寫列出來。
input {1,2,3}
output{1,2,3},{1,3,2},{2,3,1}......(懶得敲了)
代碼:
#include <iostream> using namespace std; int n = 0; void swap(char *q ,char *p) { //交換函數(shù) int temp; temp= *q; *q = *p; *p = temp; } void perm(char arr[],int k, int m ) { int i; if(k >m) { for(i = 0 ; i <= m ; i++) { //遞歸結(jié)束出口,當數(shù)列只剩下一個數(shù)的時候輸出 cout<<arr[i]<<" "; } cout<<endl; } else { for(i = k ; i <=m;i++) { //遞歸部分 swap(arr[k],arr[i]); perm(arr,k+1,m); /*把數(shù)組看成1{234}+2{134}+3{124}+4{123}再把{234}看成2{34}+3{24}+4{23}一直把整體化為部分,一直把大問題分解成小問題。*/ swap(arr[k],arr[i]); } } } int main() { char arr[] ="1234"; perm(arr,0,3); return 0; }
2.漢諾塔問題
就是移環(huán)子的游戲
這個也可以用遞歸算法實現(xiàn)。
ABC分別是123柱子,代碼思路大概是這樣的
把N-1層的環(huán)子先通過C移到B,最后再把第N層的最大的環(huán)子移到C,這個時候就剩下一個N-1層的新“塔”,那么我們把他看成一個新的“塔”把B柱看成之前的A柱,通過C柱把(N-1)-1層移到A柱,再把第N-1層的最大(原本第二大)的環(huán)子放到C,如此循環(huán)最后N=1 就了解了。
總結(jié)
以上是生活随笔為你收集整理的C++递归算法经典实例详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 递归算法经典实例python-pytho
- 下一篇: 程序员素质面试题