数据结构——递归

一、递归的一般定义
       所谓递归,通俗来说就是函数自己调用自己的过程,但是要明确的一点是,递归一定要有自己的出口,要不然就会陷入一种“无法自拔”的境地!!!
二、递归的用处
       递归一般用于解决三类问题:
      1.数据的定义是按照递归定义的(斐波那契);
      2.问题解法按照递归算法解决(回溯);
      3.数据的结构形式按照递归定义的(树的遍历,图的搜索)。

三、递归小算法

//斐波那契数列递归
long long Fac(int N)
{
	if (N <= 2)
	{
		return 1;
	}
	else
	{
		return (Fac(N - 1) + Fac(N - 2));
	}
}
//改变参数列表来实现
long long Fac(int first,int second,int N)
{
	if (N <= 2)
	{
		return first + second;
	}
	else
	{
		return Fac(second, first + second, N-1);
	}
}
//二分查找
int BinarySearch(int *array,int data,int left,int right)
{
	int mid = 0;
	while (left <= right)
	{
		mid = left + ((right - left) >> 1);
		if (array[mid] > data)
		{
			return BinarySearch(array, data, left, mid - 1);
		}
		else if (array[mid] < data)
		{
			return BinarySearch(array, data, mid + 1, right);
		}
		else
		{
			return mid;
		}
	}
}
//逆向打印数组
void PrintArray(int *array, int size)
{
	if (size > 0)
	{
		cout << array[size - 1]<<" ";
		PrintArray(array, size - 1);
	}
}
//递归实现一个字符串是否是回文

int IsPalindereme(char *str,int size)
{
	for (int idx = 0; idx <= ((size) / 2); idx++)
	{
		if (str[idx] != str[size - idx - 1])
		{
			return -1;
		}
	}
	return 0;
}
int IsPalindereme(char *str, int size)
{
	if (str == NULL)
	{
		return -1;
	}
	if ((size == 0) || (size == 1))
	{
		return 0;
	}
	if (*str != *(str + size - 1))
	{
		return -1;
	}
	else
	{
		return IsPalindereme(str + 1, size - 2);
	}
}
//全排列
void Perm(int *array, int size, int N)
{
	if (N == size)
	{
		for (int idx = 0; idx < size; idx++)
		{
			cout << array[idx] << " ";
		}
		cout << endl;
	}
	else
	{
		for (int idx = N; idx < size; idx++)
		{
			std::swap(array[idx], array[N]);
			Perm(array, size, N + 1);
			std::swap(array[idx], array[N]);
		}
	}
}

//单链表操作
struct Node
{
	Node(int data)
	:_data(data)
	, _pnext(NULL)
	{}

	int _data;
	Node* _pnext;
};


void Print(Node* pHead)//逆向打印单链表
{
	if (pHead)
	{
		Print(pHead->_pnext);
		cout << pHead->_data << "->";
	}
}


void Destroy(Node* pHead)//逆向销毁单链表中的各个节点
{
	if (pHead)
	{
		Destroy(pHead->_pnext);
		delete pHead;
		pHead = NULL;
	}
}


Node* Find(Node* pHead,int data)//单链表中查找某个值为data的节点
{
	if (pHead)
	{
		Node *node = Find(pHead->_pnext, data);
		{
			if (node)
			{
				return node;
			}
		}
		if (pHead->_data == data)
		{
			return pHead;
		}
	}
	return NULL;
}

//求n的阶乘
long long recursive(int n)
{
	int sum = 0;
	if ((n == 1)||(n==0))
	{
		return 1;
	}
	else
	{
		sum=n*recursive(n - 1);
		return sum;
	}
}
//河内塔问题——把第一个柱子上的柱子借助第二个柱子移动到第三个柱子上,并且不改变顺序
void hanoi(int n,int p1,int p2,int p3)
{
	if (n == 1)
	{
		cout << "珠子从" << p1 << "移动到" << p3 << endl;
	}
	else
	{
		hanoi(n - 1, p1, p3, p2);
		cout << "珠子从" << p1 << "移动到" << p3 << endl;
		hanoi(n - 1, p2, p1, p3);
	}
}

如有错误,欢迎批评指正呦!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值