文章目录
一、意义
1. 举例
2. 意义
二、队尾身高
1. 审题
题目描述
输入描述
输出描述
样例1
提示
2. 思路
3. 参考答案
#include <iostream>
using namespace std;
int n;
double h(int n)
{
if (n == 1) return 200;
return h(n-1) * 0.9;
}
int main()
{
cin >> n;
if (n == 0)
{
cout << "Error: It is not possible to have 0 people.";
return 0;
}
cout << h(n);
return 0;
}
三、斐波那契数列
1. 思路
2. 参考答案
#include <iostream>
using namespace std;
int n;
long long f(int n)
{
if (n <= 2) return 1;
return f(n-1) + f(n-2);
}
int main()
{
cin >> n;
if (n == 0)
{
cout << "impossible index.";
}
cout << f(n);
return 0;
}
四、楼梯走法
1. 审题
题目描述
输入描述
输出描述
样例1
样例2
样例3
提示
2. 思路
3. 参考答案
3.1 递归
#include <iostream>
using namespace std;
int n;
long long f(int n)
{
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
return f(n-1) + f(n-2) + f(n-3);
}
int main()
{
cin >> n;
cout << f(n);
return 0;
}
3.2 记忆化搜索
#include <iostream>
using namespace std;
int n;
int a[40] = {0, 1, 2, 4};
long long f(int n)
{
if (a[n] != 0) return a[n];
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
return a[n] = f(n-1) + f(n-2) + f(n-3);
}
int main()
{
cin >> n;
cout << f(n);
return 0;
}
四、辗转相除
1. 审题
2. 参考答案
#include <iostream>
using namespace std;
long long a, b;
int gcd(int x, int y)
{
if (x % y == 0) return y;
return gcd(y, x % y);
}
int main()
{
cin >> a >> b;
int gcdAns = gcd(a, b);
long long lcmAns = a * b / gcdAns;
// cout << lcmAns;
// cout << gcdAns;
return 0;
}
五、角谷猜想/克拉兹猜想/冰雹猜想步数
1. n 到 1 经过的次数
#include <iostream>
using namespace std;
int n;
int f(int n)
{
if (n == 1) return 0;
if (n % 2 == 0) return f(n/2) + 1;
else return f(n*3+1) + 1;
}
int main()
{
cin >> n;
cout << f(n);
return 0;
}
2. 找 n 的下一个数
#include <iostream>
using namespace std;
int n;
int cnt;
void f(int n)
{
if (n == 1) return;
cnt++;
if (n % 2 == 0) f(n/2);
else f(n*3+1);
}
int main()
{
cin >> n;
f(n);
cout << cnt;
return 0;
}
3. 累加次数
#include <iostream>
using namespace std;
int f(int n, int cnt)
{
if (n == 1) return cnt;
if (n % 2 == 0) return f(n/2, cnt+1);
else return f(n*3+1, cnt+1);
}
int main()
{
int n;
int cnt = 0;
cin >> n;
cnt = f(n, 0);
cout << cnt;
return 0;
}
六、[NOIP2001 普及组] 数的计算
1. 审题
题目描述
输入格式
输出格式
样例 #1
提示
2. 参考答案
2.1 简单递归
#include <iostream>
using namespace std;
int n;
int cnt;
void f(int x)
{
if (x == 1) return; // 一个分叉的边界
for (int i = 1; i <= x/2; i++)
{
cnt++; // 记录调用了几次f()函数
f(i);
}
}
int main()
{
cin >> n;
f(n);
cout << cnt+1;
return 0;
}