递归之有返回值的递归类型

复制代码
最经典的类型就是返回正整数n前n个数字的和

#include <bits/stdc++.h>
using namespace std;
int sum(int n){
	if(n == 1)return 1;
	
	int ans = 0;
		
	ans += (n + sum(n - 1));
	
	return ans;
}

int main(){
	int n;cin >> n;
	
	cout << sum(n) << endl;
	
	return 0;
}

我们对上述代码进行一个具体例子的书写:n = 5时:
① ans = 0,ans = ans + 5 + sum(4) 此时系统栈会帮我们记录好这个状态语句以及没有执行的语句 return ans
② ans = 0,ans = ans + 4 + sum(3) 此时系统栈会帮我们记录好这个状态语句以及没有执行的语句 return ans
③ ans = 0,ans = ans + 3 + sum(2) 此时系统栈会帮我们记录好这个状态语句以及没有执行的语句 return ans
④ ans = 0,ans = ans + 2 + sum(1) 此时系统栈会帮我们记录好这个状态语句以及没有执行的语句 return ans
⑤ return 1
一旦开始return,就会一直return到最开始的条件,这个是递归的规则,不可改变的规则
④ sum(1) return了一个1,所以ans = 3 并且return 3
③ sum(2) return了一个3,所以ans = 6 并且return 6
② sum(3) return了一个6,所以ans = 10 并且return 10
④ sum(4) return了一个10,所以ans = 15 并且return 15

总结一下,不管是有没有值的递归,共同点是系统栈会帮我们记录下当前状态和没有执行的语句
这里是一旦开始进行递归,就是一直不停地向下面开始递归
对于没有返回值类型的递归还可能会进行到最下面的一层,然后返回到上一层,然后继续往下

复制代码
https://www.luogu.com.cn/problem/P1028数的计算

分析:每一个数字都要计算从1开始到这个数字一半

复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int f[N];
int sol(int x){
	if(x == 1) return 1;
	if(f[x] != -1)return f[x];
	int ans = 1;
	for(int i = 1;i <= x / 2;i ++){
		ans += sol(i);
		f[x] = ans;
	}
	return f[x];
}

int main(){
	int n;cin >> n;
	memset(f,-1,sizeof f);
	cout << sol(n) <<  endl;
	return 0;
}
相关推荐
luj_17682 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
mCell3 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
KaMeidebaby4 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_17685 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
tmlx3I0815 小时前
高光谱拼接算法(六)RANSAC 误匹配剔除
人工智能·算法·机器学习
不相心 -w-5 小时前
基础-滑动窗口-(定长 | 不定长)
算法
醉城夜风~6 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
ysa0510306 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH6 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
hurrycry_小亦6 小时前
洛谷题目:P1215 [USACO1.4] 母亲的牛奶 Mother‘s Milk 题解(本题简)
算法