递归与循环比较

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

递归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);
}

  

posted @ 2024-02-20 08:44  心悟&&星际  阅读(60)  评论(0)    收藏  举报