遞迴是程式設計中的一種演算法。乙個過程或函式直接呼叫自己本身或通過其他的過程或函式呼叫語句間接地呼叫自己的過程或函式,稱為遞迴過程或函式。
例子一:打靶
面試1:乙個射擊運動員打靶,靶一共有10環,連開10槍打中90環的可能性有多少種?
方法1:使用迴圈
for(i1=0;i1<=10;i1++)for(i2=0;i2<=10;i2++)
for(i3=0;i3<=10;i3++)
...for(i10=0;i10<=10;i10++)
但是,上面的迴圈程式雖然解決了問題,但時間複雜度和空間複雜度無疑是很高的,比較好的辦法當然是採用遞迴的方式。
方法二:
遞迴的條件由以下4步完成:
1)如果出現這種情況,即使後面每槍都打10環也無法打夠總環數90,這種情況下就不用再打了,則退出遞迴。**如下:
if(score<0||score>(num+1)*10) //次數num為0~9
return;
2)如果滿足條件且打到最後一次(因為必須打10次),**如下:
if(num==0)
output();
return;
3)如果沒有出現以上兩種情況則執行遞迴,**如下:
for(int i=0;i<=10;++i)
//這裡實際上為了方便把順序倒了過來,store[num]是最後一次打的出現的環數
//store[9]第10次打出現的環數,store[8]第9次打出現的環數,...,store[0]第一次打出現的環數
store[num]=i;//每一次打都11種環數可以選擇
cumput(score-i,num-1,store);
4)列印函式,符號要求的則把它列印出來,**如下:
void output(int store)
for(int i=9;i>=0;--i)
cout完整**:
#include#includeusing
namespace
std;
long
long
global=0
;vector
int> >res;
void cumput(int score,int n,vector &tmp)
for(int i=0;i<11;i++)
}int
main()
}
#include#includeusing
namespace
std;
vector
int> >res;
void cumput(int score,int n,vector &tmp)
for(int i=0;i<11;i++)
}int
main()
例子二:
八皇后問題:
從每一行開始填充皇后檢查是否滿足要求,因此,如果是有效的皇后滿足的條件是:
1)選擇的列與前面已經防止皇后的列不在同一列。
2)檢查從改行開始的第一行的主對角線是否滿足要求
3)檢查從該行開始到第一行的副對角線是否滿足要求
#include#include#include
using
namespace
std;
class
solution
void helper(vector &str,int n,int start,vectorstring> > &res)
for(int col=0; col)}}
bool isvalid(vector &str,int row,int
col)
for(i=row-1,j=col-1; i>=0&&j>=0; i--,j--)
for(i=row-1,j=col+1; i>=0&&j<(int)str.size(); i--,j++)
return
true
; }
};int
main()
}
例子三:求字元子集
見:
例子四:0-1揹包問題
#include#includeusing
namespace
std;
void helper(vector &num,int m,int n,int start,vectorint> > &res)
if(m<0
)
return
;
for(int i=start; i<=n; i++)
}vector
int> > calfun(int n,int
m)int
main()
}
迴圈 遞迴 概率
遞迴是程式設計中的一種演算法。乙個過程或函式直接呼叫自己本身或通過其他的過程或函式呼叫語句間接地呼叫自己的過程或函式,稱為遞迴過程或函式。例子一 打靶 面試1 乙個射擊運動員打靶,靶一共有10環,連開10槍打中90環的可能性有多少種?方法1 使用迴圈 for i1 0 i1 10 i1 for i2...
程式設計師面試寶典筆記3 迴圈遞迴概率
include using namespace std int sum 0 int score 90 void compute int num,int scores for int i 0 i 10 i int main 主 從對角線標記初始化,表示沒有衝突 for iline 0 iline 15...
遞迴呼叫解題 概率問題
題目 概率問題 某個袋子中有紅球m個,白球n個。現在要從中取出x個球。那麼紅球數目多於白球的概率是多少呢?下面的 解決了這個問題。其中的y表示紅球至少出現的次數。這與前文的問題是等價的。因為如果取30個球,要求紅球數大於白球數,則等價於至少取出16個紅球。請根據僅存的線索,判斷程式邏輯,並補全缺少的...