递归

百度解释:程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
但是递归算法虽然显得很简洁易懂,但是运行效率很低。
例:计算阶乘n!.
f(n)=n!可定义为:f(0)=1,f(n)=f(n-1)*n;(n>=1)

#include<stdio.h>
int factorial(int n);
int main(void)
{
    int n;
    scanf("%d",&n);
    printf("%d\n",factorial(n));
    return 0;

}
int factorial(int n)
{
    return n==0?1:factorial(n-1)*n;
}

经典递归问题:汉诺塔。
//hanoi
/*原理:
当只有一个盘子的时候:
只需要把盘子从a搬到c就可以了
当有两个盘子的时候:
先将第一个盘子(从上到下按顺序以此是第i个盘子)搬到b,然后将第二个盘子搬到c,最后将第一个盘子从b搬到c。
当有更多个盘子的时候,即n个盘子的时候:
把上面的(n-1)个盘子搬到b,然后将剩下的最后一个盘子搬到c,最后将b的(n-1)个盘子搬到c。*/

#include<stdio.h>
void hanoi(int n,char a,char b,char c)/*有n个盘子,a为初始柱子,b辅助,c为目的地柱子 */
{
    if(n==1)
    {
        printf("move %c to %c\n",a,c);
    }
    else if(n>=2)
    {
        hanoi(n-1,a,c,b);/*先将上面的(n-1)个盘子搬到b,因为(n-1)盘子与n个盘子差别,多了:先将(n-1)个盘子搬到b,再将第n个盘子搬到c,最后将(n-1)个盘子搬到c (将(n-1)个盘子先视为一个整体)*/ 
        printf("move %c to %c\n",a,c);/*再将剩下的盘子(即第n个盘子)搬到柱c*/
        hanoi(n-1,b,a,c);/*再将在b上的(n-1)个盘子搬到c*/ 
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    hanoi(n,'a','b','c'); 
}

你可能感兴趣的:(递归)