递归

递归

  定义:一个函数自己直接或者间接调用自己

  递归满足的三个条件:

    1.  递归必须有终止条件

    2.  该函数所处理的数据规模必须在递减

    3.  这个转化必须是可解的

  循环和递归

    所有的循环都可以转化为递归,递归不一定都可以转化为循环

   递归: 易于理解, 速度慢, 存储空间大

   循环: 不易理解, 速度快, 存储空间小

 汉诺塔:这不是线性递归,是一个非线性递归

n=1         1

n=2          3

n=3          7

................

................

n=64           2的64次方减1【这是个天文数字,就算世界上最快的计算机也解决不了】

汉诺塔的复杂度是2的n次方减一

问题很复杂,但真正解决问题的编码就只有三句

#include <stdio.h>

int hannuota(int n, char A, char B, char C)
{
    /*如果是一个盘子
        直接将A柱子上的盘子从A移到C
    否则
        先将A柱子上的n-1个盘子借助C移到B
        直接将A柱子上的一个盘子从A移到C
        最后将B柱子上的n-1个盘子借助A移到C*/
    if(n==1)
        printf("将编号为%d的盘子直接从%c柱子移到%c柱子
", n, A, C);
    else
    {
        hannuota(n-1,A,C,B);
        printf("将编号为%d的盘子直接从%c柱子移动到%c柱子
", n, A, C);
        hannuota(n-1,B,A,C);
    }

}
int main()
{
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
    int n;

    printf("请输入要移动的盘子的个数: ");
    scanf("%d", &n);

    hannuota(n, 'A', 'B', 'C');

    return 0;
}

用递归求阶乘

#include <stdio.h>

int f(int n)
{
    if(n==1)
        return 1;
    else
        return f(n-1)+n;
}
int main()
{
    printf("%d",f(5));
    return 0;
}

用递归求1+2+3+4+5......+100=

#include <stdio.h>

int sum(int n)
{
    if(n==1)
        return 1;
    else
        return sum(n-1)+n;
}
int main()
{
 int n;
 scanf("%d",&n);
 printf("%d",sum(n));
 return 0;
}
原文地址:https://www.cnblogs.com/spore/p/11088134.html