c++递归

本文详细介绍了C++中的递归编程技巧,通过递归求n!、斐波那契数列以及解决汉诺塔问题等实例,深入浅出地讲解了递归的概念、分析方法和代码实现。递归算法的核心是函数的自我调用,通过不断缩小问题规模,最终达到边界条件并求解原问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归

1.概念

程序调用自身的编程技巧称为递归
函数直接或间接的调用自己,这样的函数叫做递归函数
递归函数要有一个结束条件
递归算法 的思想在于反复调用自身函数,每次把大问题范围缩小(小问题的求解方法与原问题相同),直到范围缩小到可以直接得到边界值,然后再在返回的路上求出原问题的解
我们先不着急,从简单的开始哈~

2.简单例题

2.1 递归求n!

2.2.1 题目

题目描述:
使用递归求 123*…*n 的结果。
答案对998244353取模。
输入格式:
一个正整数代表n。
输出格式:
计算结果对998244353取模。
样例输入:
1
样例输出:
1
约定:
1<=n<=10000

2.2.2 分析

偷懒的可以用for循环做出来(其实基本上所有的递归都可以),但是今天就不讲了哈
不难看出,这道题的边界条件为当n=1时,返回1
如果还没有到边界值,就算出n与(n-1)的乘积,并取模(余数定理可以证明这样与最后取模的效果一样)

2.2.3 代码
#include<bits/stdc++.h>
using namespace std;
long long f(int n){
	if(n==1){
		return 1;
	}else{
		return f(n-1)*n%998244353;
	}
}
int main(){
	int n;
	cin>>n;
	cout<<f(n);
	return 0;
}

注:小编试的时候在最后取模会出错哦~

2.2 斐波那契数列(Fibonacci)

2.2.1 题目

题目描述:
F[1]=F[2]=1, 当i>2时,F[i]=F[i-1]+F[i-2].
输入 n,求斐波那契数列的第 n 项。
要求使用递归。
输入格式:
一个正整数n
输出格式:
一个数表示答案
样例输入1:
3
样例输出1:
2
约定:
1<=n<=10

2.2.2 分析

与上一题一样,先分析得到当n=2或者n=1时返回1
如果不是就把(n-1)和(n-2)加起来得到这个数

2.2.3 代码
#include<bits/stdc++.h>
using namespace std;
long long f(long long n){
	if(n==1||n==2){
		return 1;
	}else{
		return f(n-1)+f(n-2);
	}
}
int main(){
	int n;
	cin>>n;
	cout<<f(n);
	return 0;
}

现在上升难度哈

3. 困难例题

3.1 输出回文数

3.1.1 题目

题目描述:
输入一个正整数n,设n有d个数位,则请你输出一个有 2d 个数位的回文数字 m,且m的后 d 位恰好就是n的前d位。
数字m可能包含前缀0 。
请只使用一个递归函数,不用printf完成这个任务。
输入格式:
一个正整数n
输出格式:
一个正整数m
样例输入1:
19260817
样例输出1:
7180629119260817
约定:
1<=n<=1e9

3.1.2 分析

这道题就是先把这个数倒序输出,再输出原数就完事了

3.1.3 代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin>>s;
	int a[10];
	for(int i=s.size()-1;i>=0;i--){
		a[s.size()-i-1]=s[i]-'0';
	}
	for(int i=0;i<s.size();i++){
		cout<<a[i];
	}
	cout<<s;
	return 0;
}

3.2 汉诺塔问题

3.2.1 题目

题目描述:
著名的汉诺塔问题:
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆环,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
1.每次只能移动一个圆盘;
2.大盘不能叠在小盘上面。
解决这类问题有以下方案:
现在假设我们要将 t 个盘子从柱子 x 放到柱子 y,则我们可以先想办法把上面的 t-1个盘子放到另一个柱子上,然后将最大的盘子放到y上,最后将那t-1个盘子放到第 y 个柱子上。那么移动 t-1 个盘子就变成了一个子问题。
给定 n ,求问:按照上述策略,一共需要多少次操作才能成功?
输入格式:
一个正整数 n
输出格式:
一个正整数表示答案。
样例输入1:
2
样例输出1:
3
约定:
1<=n<=10

3.2.2 分析

这道题目也就是每次都想办法移走上面的所有,然后拿出最下面的放到指定柱子上
终止条件就是当只有一个盘子的时候,返回1

3.2.3 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f(int x){
	if(x<=1){
		return 1;
	}else{
		return 2*f(x-1)+1;
	}
}
int main(){
	int n;
	cin>>n;
	cout<<f(n);
	return 0;
}

制作不易,点个赞吧😘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值