#include "iostream"
using namespace std;
int fun(int m,int n)
{
if(m
{
return 0;
}
else if (n==0)
{
return 1;
}
else return fun(m-1,n)+fun(m,n-1);
}
int main()
{
int m,n;
cout
cin>>m>>n;
cout<<"有"<<fun(m,n)<<"排序方法"<<endl;
return 0;
}
fun(m,n)表示的是在還鞋的有m個,借鞋子的有n個的情況下,排隊合法的情況的個數。也就是對m+n個人進行排隊,且保證按照正確規則排列的隊伍的數量。
fun(m-1,n)+fun(m,n-1)拆成fun(m-1,n),fun(m,n-1):
fun(m-1,n)表示當前最前面的一個位置,作為還鞋子的位置,那麼剩下的人進行排隊,能具有的合法的隊伍的數量(合法指的是滿足條件的隊伍)。
fun(m,n-1)表示當前最前面的一個位置,作為借鞋子的位置,那麼剩下的人進行排隊,能具有的合法的隊伍的數量。
整理一下思路:
隊伍長度為m+n,那麼最前面的一個位置是換鞋子或者是借鞋子的話對後面的情況都是有影響的,如果最前面的位置是還鞋子的話,那麼剩下的隊伍長度為(m-1)+n,其中還鞋子的為m-1個,借鞋子的為n個,繼續遞歸求這種情況的隊伍合法數量
;如果最前面的位置是借鞋子的話,那麼剩下的隊伍長度為m+(n-1),其中還鞋子的為m個,借鞋子的為n-1個,繼續遞歸求這種情況的隊伍合法數量。