17递归

递归

定义:

  • 一个函数自己直接或间接调用自己

递归满足的三个条件

  1. 递归必须得有一个明确的中止条件
  2. 该函数所处理的数据规模必须在递减
  3. 这个转化必须是可解的

循环和递归的关系:

  • 递归:优点:好理解 缺点:速度慢 ,存储空间大

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

自调用函数

# include <stdio.h>

void f(int n)
{
    if(n == 1)
        printf("哈哈\n");
    else
        f(n-1);
}

int main(void)
{
    f(3);
    return 0;
}

阶乘的循环实现

# include <stdio.h>

int main(void)
{
    int val;
    int i, mult = 1 ,s;
    printf("请输入一个数字:");
    printf("val = ");
    scanf("%d",&s);
    for(i = val; i>0 ; --i)
    {
        mult = mult * i;
    }
    printf("%d的阶乘是:%d\n", val, mult);
    
    return 0;
}

阶乘的递归实现

# include <stdio.h>

long f(long n)
{
    if (n == 1)
    {
        return 1;
    }
    else
    {
         return n*f(n-1);
    }
   
}

int main(void)
{
    long n;
    scanf("%d\n",&n);
    printf("%d的阶乘是:%ld\n", n, f(n));
    
    return 0;
}

累加的递归实现

# include <stdio.h>

long sum(int n)
{
    if (n == 1)
    {
        return 1;
    }
    else
    {
         return n+sum(n-1);
    }
   
}

int main(void)
{
    int n;
    printf("请输入累加的截止值!\n");
    scanf("%d\n",&n);
    printf("1到%d的和是:%ld\n", n, sum(n));
    
    return 0;
}

调用函数

# include <stdio.h>
void f(int n)
{
    n = g(n);
    return n;
}
void g(int m)
{
    m = m*2;
    return m;
}

int main()
{
    int val;
    cal = f(5);
    print("val = %d\n", val);
    
    return 0;
}

汉诺塔(逻辑强)

伪算法:

if(n>1)

{

  1. 先把A柱子上的前n-1个盘子从A借助C移到B
  2. 将A柱子上的n个盘子直接移到C
  3. 再将B柱子上的n-1个盘子借助A移到C

}

# include <stdio.h>

void hanluota(int n, char A, char B, char 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(void)
{
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
    int n;
    
    printf("请输入要移动盘子的个数:");
    scanf("%d",&n);
    
    hanluota(n, 'A', 'B', 'C');//假定:输入n时输入在A上,盘子从上到下由小到下排列
}

应用:走迷宫

递归的应用:

  1. 数和森林就是以递归的方式实现的
  2. 数和图的很多算法就是以递归来实现的
  3. 很多数据公式就是以递归的方式实现的:斐波拉契数列等
posted @   夜月明  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示