Recursion递归学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaomifanhxx/article/details/84248676

递归(Recursion):程序调用自身的编程技巧。

递归满足两个条件:

1)有反复执行的过程(调用自身)

2)有跳出反复执行过程的条件(递归出口)

递归案例:

1  斐波那契数列(Fibonacci Sequence)

//斐波那契数列
int fib(int n)
{
	if (n == 1 || n == 2){ return 1; }
	else
	{
		return fib(n - 1) + fib(n - 2);
	}

}

2  n的阶乘

//n的阶乘
int Factorical(int n)
{
	int sum;
	if (n == 1){ return 1; }
	else
	{
		sum = n*Factorical(n - 1);
		return sum;
	}
}

3  汉诺塔

//汉诺塔
//将编号为num的盒子从Init位置转移到dest位置
void moveOne(int current, string Init, string Dest)
{
	cout << "No." << current << "from" << Init << "to" << Dest << endl;
}
void move(int num, string Init, string temp, string Dest)
{
	if (num == 1) moveOne(num, Init, Dest);
	else
	{
		move(num - 1, Init, Dest, temp);
		moveOne(num, Init, Dest);
		move(num - 1, temp, Init, Dest);
	}
}

定义一个hanio类,方便调用

class Hanoi
{
public:
	Hanoi(int disk){ num = disk; }
	void Solve();

private:
	int num;
	void moveOne(int num, string Init, string dest);
	void move(int sum_num, string Init, string temp, string dest);
};

void Hanoi::move(int sum_num, string Init, string temp, string dest)
{
	if (sum_num == 1) moveOne(sum_num, Init, dest);
	else
	{
		move(sum_num - 1, Init, dest, temp);
		moveOne(sum_num, Init, dest);
		move(sum_num - 1, temp, Init, dest);
	}
}
void Hanoi::moveOne(int num, string Init, string dest)
{
	cout << "Move disk No. " << num << " from " << Init << " to " << dest << endl;
}
void Hanoi::Solve()
{
	string Init = "A";
	string temp = "B";
	string Dest = "C";
	move(num, Init, temp, Dest);
}

4  全排列

//全排列
void Swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
void Permutation(int num[], int start,int last)
{
	
	if (start == last )
	{
		for (int i = 0; i < last; i++)
		{
			printf("%d", num[i]);
		}
		printf("\n");
		count_num++;
	}
	else
	{
		for (int i = start; i <last; i++)
		{
			Swap(&num[start], &num[i]);
			Permutation(num, start + 1, last);
			Swap(&num[start], &num[i]);
		}
	}
}

参考博客:

https://blog.csdn.net/wwxy1995/article/details/82795325   C++全排列

https://blog.csdn.net/wencheng2998/article/details/5971194 C++全排列

https://blog.csdn.net/geekwangminli/article/details/7981570   实现汉诺塔问题

猜你喜欢

转载自blog.csdn.net/xiaomifanhxx/article/details/84248676