一些最简单的循环和递归对比

因为本人智商过于捉急,实在不懂如何运用递归。
所以写了这篇帮助自己理解。(题目是自己随便给自己出的,代码也是自己摸出来的代码,仅供参考)

1.返回数列1、2、3、4…n的前n项和

#include<iostream>
using namespace std;
int repeating(int n)//循环
{
	int res = 0;
	for (int i = 1; i <= n; i++)
		res += i;
	return res;
}
int recursion(int n)//递归
{
	if (n == 0)
		return 0;
	else if (n == 1)
		return 1;
	else
		return n + recursion(n - 1);
}
int main()
{
	int n;
	while (cin >> n)
		cout << repeating(n) << " " << recursion(n) << endl;
	return 0;
}

2.返回n的阶乘

#include<iostream>
using namespace std;
int repeating(int n)//循环
{
	int res = 1;
	for (int i = 1; i <= n; i++)
		res *= i;
	return res;
}
int recursion(int n)//递归
{
	if (n == 0 || n == 1)
		return 1;
	else
		return n * recursion(n - 1);
}
int main()
{
	int n;
	while (cin >> n)
		cout << repeating(n) << " " << recursion(n) << endl;
	return 0;
}

3.斐波那契数列(Fibonacci sequence)返回第n项

1、1、2、3、5、8、13…
递推式:a(n)=a(n-1)+a(n-2)

#include<iostream>
using namespace std;
int repeating(int n)//循环
{
	int* res = new int[n];
	res[0] = 1;
	res[1] = 1;
	for (int i = 2; i < n; i++)
		res[i] = res[i - 1] + res[i - 2];
	return res[n - 1];
}
int recursion(int n)//递归
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 1;
	else
		return recursion(n - 1) + recursion(n - 2);
}
int main()
{
	int n;
	while (cin >> n)
		cout << repeating(n) << " " << recursion(n) << endl;
	return 0;
}

4.汉诺塔问题I,返回把n个盘子移到另一个柱子需要的步数

只移动一个盘子,需要一步,即当n=1时fun(n)=1,
否则,
先移动上面n-1个盘子到额外柱,fun(n-1)步,
再把最底的1个盘子移到目标柱,1步,
再把额外柱的n-1个盘子移到目标柱,fun(n-1)步,总共需要2*fun(n-1)+1步。

#include<iostream>
using namespace std;
int repeating(int n)//循环
{
	int* res = new int[n];
	res[0] = 1;
	for (int i = 1; i < n; i++)
		res[i] = 2 * res[i - 1] + 1;
	return res[n - 1];
}
int recursion(int n)//递归
{
	if (n == 1)
		return 1;
	else
		return 2 * recursion(n - 1) + 1;
}
int main()
{
	int n;
	while (cin >> n)
		cout << repeating(n) << " " << recursion(n) << endl;
	return 0;
}

5.打印数列1、2、3、4、5…n

#include<iostream>
using namespace std;
void repeating(int n)//循环
{
	for (int i = 1; i <= n; i++)
		cout << i << " ";
}
void recursion(int n)//递归
{
	if (n == 1)
		cout << 1 << " ";
	else
	{
		recursion(n - 1);
		cout << n << " ";
	}
}
int main()
{
	int n;
	while (cin >> n)
	{
		repeating(n);
		cout << endl;
		recursion(n);
		cout << endl;
	}
	return 0;
}

6.打印数列1、2、3、4…n的前n项和数列

在打印的值不像上一题那样可以很容易地从任意第n项出发推出其前后项,并且不使用推导所得的通项公式时,似乎必须使用一个函数外部的辅助变量来辅助递归函数实现本题功能。

#include<iostream>
using namespace std;
void repeating(int n)//循环
{
	int res = 0;
	for (int i = 1; i <= n; i++)
	{
		res += i;
		cout << res << " ";
	}
}
void recursion(int n, int& temp)//递归
{
	if (n == 1)
		temp = 1;
	else
	{
		recursion(n - 1, temp);
		temp += n;
	}
	cout << temp << " ";
}
int main()
{
	int n;
	int t = 0;//递归函数的辅助变量
	while (cin >> n)
	{
		repeating(n);
		cout << endl;
		recursion(n, t);
		cout << endl;
	}
	return 0;
}

7.打印阶乘数列1!、2!、3!、4!..n!

与上一题几乎完全相同

#include<iostream>
using namespace std;
void repeating(int n)//循环
{
	int res = 1;
	for (int i = 1; i <= n; i++)
	{
		res *= i;
		cout << res << " ";
	}
}
void recursion(int n, int& temp)//递归
{
	if (n == 1)
		temp = 1;
	else
	{
		recursion(n - 1, temp);
		temp *= n;
	}
	cout << temp << " ";
}
int main()
{
	int n;
	int t = 0;//递归函数的辅助变量
	while (cin >> n)
	{
		repeating(n);
		cout << endl;
		recursion(n, t);
		cout << endl;
	}
	return 0;
}

8.打印阶乘数列1!、2!、3!、4!..n!并将所该数列保存为数组t[n]

#include<iostream>
using namespace std;
void repeating(int n,int* t)//循环
{
	int res = 1;
	for (int i = 1; i <= n; i++)
	{
		res *= i;
		*(t + i - 1) = res;
		cout << res << " ";
	}
}
void recursion(int n, int* t)//递归
{
	if (n == 1)
		*t = 1;
	else
	{
		recursion(n - 1, t);
		*(t + n - 1) = *(t + n - 2) * n;
	}
	cout << *(t + n - 1) << " ";
}
int main()
{
	int n;
	while (cin >> n)
	{
		int* t1 = new int[n]();
		int* t2 = new int[n]();
		repeating(n, t1);
		cout << endl;
		recursion(n, t2);
		cout << endl;
		cout << "数组保存结果:\n";
		for (int i = 0; i < n; i++)
			cout << t1[i] << " ";
		cout << endl;
		for (int i = 0; i < n; i++)
			cout << t2[i] << " ";
		cout << endl;
	}
	return 0;
}

9.打印斐波那契数列并将数列保存为数组t[n]

#include<iostream>
using namespace std;
void repeating(int n,int* t)//循环
{
	*t = 1;
	*(t + 1) = 1;
	for (int i = 0; i < n; i++)
	{
		if (i == 0 || i == 1)
			cout << 1 << " ";
		else
		{
			*(t + i) = *(t + i - 1) + *(t + i - 2);
			cout << *(t + i) << " ";
		}
	}
}
void recursion(int n, int* t)//递归
{
	*t = 1;
	*(t + 1) = 1;
	if (n == 2)
		cout << 1 << " ";
	else if(n > 2)
	{
		recursion(n - 1, t);
		*(t + n - 1) = *(t + n - 2) + *(t + n - 3);
	}
	cout << *(t + n - 1) << " ";
}
int main()
{
	int n;
	while (cin >> n)
	{
		int* t1 = new int[n]();
		int* t2 = new int[n]();
		repeating(n, t1);
		cout << endl;
		recursion(n, t2);
		cout << endl;
		cout << "数组保存结果:\n";
		for (int i = 0; i < n; i++)
			cout << t1[i] << " ";
		cout << endl;
		for (int i = 0; i < n; i++)
			cout << t2[i] << " ";
		cout << endl;
	}
	return 0;
}

未完待续

猜你喜欢

转载自blog.csdn.net/xyl465228957/article/details/86619892