(1)什么时候可以用递归?
当一个问题可以按照某个规律或者公式一层一层剥,没剥一层就减小一层时,就可以转变成递归问题来求解!
以下举出几个常见的可以用递归的方法来解决的问题
第一:
利用递归求数组A[n]的平均值和最大整数值
int average(int aa[],int n)
{
int k=A[n-1];
if(k==2) return((aa[0]+aa[1])/2);
else return k/2+average(aa[],n-1)/2;
}
int max(int A[],int n)
{
int k=A[n-1];
if(n==2) return A[0]>A[1]?A[0]:A[1];
else return k>max(A[],n-1)?k:max(A[],n-1) ;
}
第二:
对半搜索的递归算法
int Search(int x,int low,int high,int aa[])
{
int i;
if(low<high)
{
i=(low+high)/2;
if(x<elements[i]) return Search(x,low,i-1);
else if (x>elements[i]) return Search(x,i+1,high);
else return i;
}
第三: 快速排序的递归算法
第四:从尾到头输出链表
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
void PrintListReversely(ListNode* pListHead)
{
if(pListHead != NULL)
{
// Print the next node first
if (pListHead->m_pNext != NULL)
{
PrintListReversely(pListHead->m_pNext);
}
// Print this node
printf("%d", pListHead->m_nKey);
}
}
扩展:该题还有两个常见的变体:
1. 从尾到头输出一个字符串;
2. 定义一个函数求字符串的长度,要求该函数体内不能声明任何变量。
还有等等的用递归的方法:求一个数的二件制数,以及求一个数的所有素数