首页 > 其他分享 >递归与循环比较

递归与循环比较

时间:2024-02-20 09:01:49浏览次数:24  
标签:std 递归 int namespace 循环 using include 比较

下面通过几个例子,对递归与循环进行比较。

递归1

#include<iostream>
using namespace std;
void dfs(int n)
{
   	if (n==0) return;
	   cout<<n<<” “;
  dfs(n-1); 
}
int main()
{
	 dfs(10000);
    dfs(75000);//运行RE
}

  说明递归对内存有一定的消耗

对应的循环

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n
    for (int i=n;i>0;i--) cout<<i<<" ";
    return 0;
}

  输入

10000

75000均不会RE,因为不会产生内存消耗

 

递归2

#include<iostream>
using namespace std;
void dfs(int n)
{
    int a[10000]
	 if (n==0) return;
	 dfs(n-1); 
}
int main()
{
	dfs(75);//运行RE
	dfs(50);
}

  说明递归对内存有一定的消耗,如果递归函数中有定义数组这种变量,内存消耗更大。对应循环

#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n
	for (int i=n;i>0;i--){ int a[10000]; cout<<i<<" ";}
	return 0;
}

  输入

10000

75000均不会RE,因为不会产生内存消耗

递归3

#include<iostream>
using namespace std;
void dfs(int n)
{
	if (n==0) return;
	cout<<n<<" ";
	dfs(n-1);
	cout<<n<<" "; 
}
int main()
{
	dfs(5);
}

  递归函数有递和归两个阶段

对应循环

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for (int i=n;i>0;i--) {
		cout<<i<<" ";
	}
	for (int i=1;i<=n0;i++) {
		cout<<i<<" ";
	}
	return 0;
}

  递归4

  

#include<iostream>
using namespace std;
void dfs(int n)
{
	if (n<=0) return;
	cout<<n<<" ";
	dfs(n-1);
	dfs(n-2);
}
int main()
{
	dfs(5);
}

  输出5 4 3 2 1 1 2 1 3 2 1 1

这个递归用简单循环就比较难实现了,从递归树上理解其运行情况

递归5

#include<iostream>
using namespace std;
void dfs(int n)
{
	if (n<=0) return;
	cout<<n<<" ";
	dfs(n-1);
	cout<<n<<" ";
	dfs(n-2);
	cout<<n<<" ";
}
int main()
{
	dfs(5);
}

  输出5 4 3 2 1 1 1 2 2 3 1 1 1 3 4 2 1 1 1 2 2 4 5 3 2 1 1 1 2 2 3 1 1 1 3 5

 递归6

#include<iostream>
using namespace std;
void dfs(int n)
{
	if (n<=0) return;
	cout<<n<<" ";
	dfs(n-1);
	cout<<n<<" ";
	dfs(n-2);
}
int main()
{
	dfs(5);
}

  输出5 4 3 2 1 1 2 3 1 1 4 2 1 1 2 5 3 2 1 1 2 3 1 1

从递归树分析一下

递归可以实现多重循环且嵌套层次不是固定的,循环结构的循环嵌套格式,嵌套层次是固定的

递归7

#include<iostream>
using namespace std;
void dfs(int n)
{
	if (n<=0) return;
	for (int i=1;i<=n;i++)
	{
		cout<<i<<" ";
	}
	cout<<endl;
	dfs(n-1);
}
int main()
{
	dfs(2);
}

  对应循环

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for (int i=n;i>0;i--) {
		for (int j=1;j<=i;j++)
		{
			cout<<j<<" ";
		}
		cout<<endl;
	}
	return 0;
}

  递归8

#include<iostream>
using namespace std;
void dfs(int n)
{
	if (n<=0) return;
	for (int i=1;i<=n;i++)
	{
		cout<<i<<" ";
		dfs(n-1);
	}
}
int main()
{
	dfs(3);
}

  输出1 1 1 2 1 2 1 1 2 1 3 1 1 2 1

递归9

#include<iostream>
#include<vector>
using namespace std;
vector<int> p;
void dfs(int n)
{
	if (n<=0) 
	{
		for (int j=0;j<p.size();j++)
		{
			cout<<p[j]<<" ";
		}
		cout<<endl;
		return;	
	}
	for (int i=1;i<=n;i++)
	{
		p.push_back(i);
		dfs(n-1);
		p.pop_back();
	}
}
int main()
{
	dfs(3);
}

  递归10

  

#include<iostream>
#include<vector>
using namespace std;
vector<int> p;
int N;
void dfs(int n)
{
	if (n<=0) 
	{
		for (int j=0;j<p.size();j++)
		{
			cout<<p[j]<<" ";
		}
		cout<<endl;
		return;	
	}
	for (int i=1;i<=N;i++)
	{
		p.push_back(i);
		dfs(n-1);
		p.pop_back();
	}
}
int main()
{
	N=2;
	dfs(N);
}

  

标签:std,递归,int,namespace,循环,using,include,比较
From: https://www.cnblogs.com/smghj/p/18022325

相关文章

  • 编译期循环执行的代码
    使用模板元编程进行递归编写,来实现编译期代码循环执行例:给定一个无符号整数(unsignedint),求该整数对应的二进制数中有几个1#include<iostream>template<size_tinput>constexprsize_tonesCount=(input%2)+onesCount<(input/2)>;template<>constexprsize_to......
  • 深入理解 Java 方法重载与递归应用
    Java方法重载方法重载允许在同一个类中定义多个具有相同名称的方法,但参数列表必须不同。语法:returnTypemethodName(parameter1,parameter2,...,parameterN){//方法体}示例:publicclassMain{//重载add方法,支持int和double类型参数staticinta......
  • 洛谷题单指南-递推与递归-P1990 覆盖墙壁
    原题链接:https://www.luogu.com.cn/problem/P1990题意解读:用两种可旋转的形状铺满N*2的区域,求方案数,可以使用递推。解题思路:步骤1、设f[i]表示铺满i*2的区域的方案数根据要求,i*2区域最后一列有4种可能的铺法:如果采用图1铺法,则有f[i]=f[i-1]如果采用图2铺法,则有f[i]=f......
  • Json 递归解析算法笔记
    需求:最近需要处理包含多层的Json字符串解析的问题,比如需要将所有的键值对的值替换,或者将键值对的键替换,包括嵌套对象里面的。大致知道需要使用递归来操作,先记录大致步骤吧。思路:写好一个固定的函数专门处理替换步骤;在这个函数内分别判断值是数组,还是对象,还是值(值走上面的递......
  • 循环可变化的集合 数组 datatable 等 || c# winfrom DataGridView 动态UI下载功能
    Gif演示   分解步骤1,使用组件DataGridView2,使用DataSource来控制表格展示的数据来源(注意:来源需要是DataTable类型)3,需要用到异步线程。如果是不控制数据源的话,需要使用UI安全线程;(使用Control.Invoke或Control.BeginInvoke方法)4,DataGridView的列如果设置图片,尽量代码......
  • 比较厉害的积性函数求和
    听zak讲的,感觉很厉害。给定一个积性函数\(S\),可以快速计算\(S(p^k)\),求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mS(ij)\)。把\(n,m\)当作同阶。我们考虑枚举\(i,j\)的\(\gcd\)。\(\sum\limits_{g=1}^{\min(n,m)}\sum\limits_{i=1}^{n/g}\sum\limits_{j=1}^{m/g}S......
  • for 循环 和 while循环的区别
     001、for循环:for循环的终止条件在for语句后面已经提前已知[root@pc1test1]#for((i=1;i<=3;i++));doecho$i;done##终止条件i<=3;i的变化规律;提前已知123 002、while循环;while循环的终止条件是在循环体中动态变化的[root@pc1test1]#i=1[roo......
  • while循环与until循环的区别
     001、while循环:条件满足一直执行[root@pc1test1]#i=1##条件满足,一直执行[root@pc1test1]#while[[$i-le3]];doecho$i;i=$((i+1));done123 002、until循环;条件不满足一直执行[root@pc1test1]#i=1##条件不满足,一直执行,与while循环相......
  • C语言进行时2--判断与循环
    if判断单:if(条件){}双:if(条件){}else{}多if(条件){}elseif(条件2){}elseif(条件3){}......elseif(条件n){}elseswitch-case匹配:switch(控制表达式){case常量1:语句1break;case常量2:语句2break;case常量3:语句3break;......case常量n:语句nbreak;default:语句}控制......
  • Go循环打印cat-dog-fish。。。。。
    packagemainimport( "fmt" "sync")//三个协程交替打印catdogfishvarrepeatCount=10funcmain(){ //wg用来防止主协程提前先退出 wg:=&sync.WaitGroup{} wg.Add(3) chCat:=make(chanstruct{},1) chDog:=make(chanstruct{},1) chFis......