1. 程式人生 > >資料結構--遞迴練習

資料結構--遞迴練習

///////////////////////////////////////遞迴練習//////////////////////////////////////
#include<iostream>
using namespace std;

//求前N個自然數之和
int Sum(int N)
{
	if(N == 1)
		return 1;
	return Sum(N-1)+N;
}

//求N的階乘
int Fac(int N)
{
	if(N == 0)
		return 1;
	return Fac(N-1)*N;
}

typedef struct Node
{
	Node(int data)
		:_data(data)
		,_next(NULL)
	{}
	int _data;
	struct Node* _next;
}Node;
//逆序列印單鏈表
void PrintFromTail2Head(Node* pHead)
{
	if(pHead)
	{
		PrintFromTail2Head(pHead->_next);
		cout<<pHead->_data<<" ";
	}
}

//逆序銷燬單鏈表
void Destroy(Node*& pHead)
{
	if(pHead)
	{
		Destroy(pHead->_next);
		delete pHead;
		pHead = NULL;
	}
}

//在單鏈表中逆序查詢某個值為data的結點
Node* FindFromTail(Node* pHead, size_t data)
{
	if(pHead)
	{
		if(pHead->_data == data)
			return pHead;

		return FindFromTail(pHead->_next, data);
	}
	return NULL;

}
//二分查詢遞迴形式
int BinarySeach(int arr[], int left, int right, int key)
{
	int mid = left + (right - left);
	if(left < right)
	{
		if(arr[mid] == key)
			return arr[mid];
		else if(arr[mid] > key)
			return BinarySeach(arr, left, mid-1, key);
		else
			return BinarySeach(arr, mid+1, right, key);
	}
	return -1;
}
//逆序列印陣列中的元素
void PrintFromTail(int arr[], int size)
{
	if(size)
	{
		cout<<arr[size-1]<<" ";
		PrintFromTail(arr, size-1);		
	}
}

//判斷一個字串是否為迴文
bool IsPalindrome(char* str, size_t size)
{
	if(size <= 1)//遞迴出口 當只有一個字元退出
		return true;
	if(str[0] != str[size-1])//或當前字串中第一個和最後一個不等就退出
		return false;
	/*return */IsPalindrome(++str, size-2);//遞迴
}



int main()
{
	/*char* str = "12321";
	int size = strlen(str);
	cout<<IsPalindrome(str, size)<<endl;*/

	//int arr[] = {1,2,3,4,5,6,7,8,9};
	//cout<<BinarySeach(arr, 0, 4, 3)<<endl;

	//int size = sizeof(arr)/sizeof(arr[0]);
	//PrintFromTail(arr, size);


	/*Node* p;
	Node* p1 = new Node(1);
	Node* p2 = new Node(2);
	Node* p3 = new Node(3);
	Node* p4 = new Node(4);
	p1->_next = p2;
	p2->_next = p3;
	p3->_next = p4;

	p = FindFromTail(p1,3);*/
	
	//Destroy(p1);
	//PrintFromTail2Head(p1);
	//cout<<endl;
     
	

	//cout<<Sum(5)<<endl;
	//cout<<Fac(3)<<endl;
	system("pause");
	return 0;
}