一本通 1.6.2 递归函数

 测评网站:信息学奥赛一本通(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));
}

记忆化递归(自行编写) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值