测评网站:信息学奥赛一本通(C++版)在线评测系统
1158:求1+2+3+...
【题目描述】
用递归的方法求1+2+3+……+N的值。
【题目分析】
本题可以使用递归替代一层循环。要算n就要算n-1直到加到1为止
int add(int n) {
if (n == 1) return 1;
return n + add(n - 1);
}
1159:斐波那契数列
【题目描述】
用递归函数输出斐波那契数列第n项。0,1,1,2,3,5,8,13……
【题目分析】
本题问题本身就是一种递归定义。要算n就要算n-1和n-2项,直到n==1 返回0 和n==2 返回1
int f(int n) {
if (n == 2) return 1;
if (n == 1) return 0;
return f(n - 1) + f(n - 2);
}
代码优化(记忆化递归):
int a[10005];
int f(int n) {
if (a[n] != 0) return a[n];
if (n == 2) return a[n] = 1;
if (n == 1) return a[n] = 0;
return a[n] = f(n - 1) + f(n - 2);
}
1160:倒序数
【题目描述】
输入一个非负整数,输出这个数的倒序数。例如输入123,输出321。
【题目分析】
本题可以使用递归栈的特性,先进后出FILO。直到取出的数小于10或者等于0
void f(int n) {
if (n == 0) return;
cout << n % 10;
f(n / 10);
return;
}
1161:转进制
【题目描述】
用递归算法将一个十进制数X转换成任意进制数M(M≤16)
【题目分析】
转进制的方法,取余数倒着写,本题利用递归栈的特性,先进后出FILO。直到x==0
因为是16进制以内,余数可能大于9,需要使用ABCDEF表示
void f(int x, int m) {
if (x == 0) return;
f(x / m, m);
if (x % m > 9)
printf("%c", x % m - 10 + 'A');
else
printf("%d", x % m);
return;
}
1162:字符串逆序
【题目描述】
输入一串以‘!’结束的字符,按逆序输出。
【题目分析】
void f() {
char c;
if (cin >> c, c == '!') return;
f();
cout << c;
}
1163:阿克曼(Ackmann)函数
【题目描述】
【题目分析】
递归终止条件 m==0,递归方式
朴素解法:
int akm(int m, int n) {
if (m == 0) return n + 1;
if (n == 0) return akm(m - 1, 1);
return akm(m - 1, akm(m, n - 1));
}
记忆化递归:(f第二维范围会超过要求的数据范围,定义尽可能大些)
int f[10][10005];
int akm(int m, int n) {
if (f[m][n] != 0) return f[m][n];
if (m == 0) return f[m][n] = n + 1;
if (n == 0) return f[m][n] = akm(m - 1, 1);
return f[m][n] = akm(m - 1, akm(m, n - 1));
}
1164:digit函数
【题目描述】
在程序中定义一函数digit(n,k),它能分离出整数n从右边数第k个数字。
【题目分析】
void digit(int n, int k) {
if (k == 1) {
cout << n % 10;
return;
}
digit(n / 10, --k);
}
1165:Hermite多项式
【题目描述】
【题目分析】
递归终止条件 n==0,n==1
朴素解法:
double h(int n, double x) {
if (n == 0) return 1;
if (n == 1) return 2 * x;
return 2 * x * h(n - 1, x) - 2 * (n - 1) * h(n - 2, x);
}
记忆化递归
double a[100];
double h(int n, double x) {
if (a[100] != 0) return a[100];
if (n == 0) return a[n] = 1;
if (n == 1) return a[n] = 2 * x;
return a[n] = 2 * x * h(n - 1, x) - 2 * (n - 1) * h(n - 2, x);
}
1166:求f(x,n)
【题目描述】
【题目分析】
递归函数f(x,n)
终止条件:当n==1时,返回 sqrt(1+x)
递归方式:sqrt(n+f(x,n-1))
朴素解法:
double f(double x, int n) {
if (n == 1)return sqrt(1 + x);
else {
return sqrt(n + f(x, n - 1));
}
}
记忆化递归(自行编写)
1167:再求f(x,n)
【题目描述】
【题目分析】
递归函数f(x,n)
终止条件:当n==1时,返回 x/(1+x)
递归方式:x/(n+f(x,n-1))
朴素解法:
double f(double x, int n) {
if (n == 1) return x / (1 + x);
return x / (n + f(x, n - 1));
}
记忆化递归(自行编写)