题目
tips:
1.写递归要有递归边界条件,递归过程就是向边界不断靠近
这里注意:虽然题目给的m,n输入数据范围是>=1的,但不代表边界就是这个;
首先,n=0肯定是不存在的,所以n的边界肯定是1;
其次,m边界为什么可以是0不是1呢,因为当m逐渐减少逼近递归边界时,可能出现(只要可能就必须以更边界的数作为边界数)n>m的情况,这时f(m,m)=f(m,m-1)+f(m-m,m),所以m是可以为0的,既然有更小的数字,就要以更小的数字做边界。
2.
这里首先根据m,n大小分类;
n<=m时, 分一定有空盘子和一定没有空盘子为分类点。
3.写递归:根据题目写递归原理+写递归条件
答案
#include <iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int f(int m, int n)
{
if (m == 0 || n == 1)
return 1;
if (m < n)
return f(m, m);
if (m >= n)
return f(m, n - 1) + f(m - n, n);
}
int main()
{
int t; cin >> t;
while (t--)
{
int m, n;cin >> m >> n;
cout << f(m, n) << endl;
}
return 0;
}