資料結構--遞迴練習
阿新 • • 發佈:2019-01-23
///////////////////////////////////////遞迴練習//////////////////////////////////////
#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;
}