C语言简介之 函数递归,用递归实现汉诺塔移动,0~9全排列

本文介绍了C语言中的函数递归概念,通过递归算法详细阐述了如何模拟汉诺塔的移动过程以及实现0到9的全排列。递归虽然消耗内存且速度较慢,但其思路清晰,能有效解决复杂问题。

函数递归:

  函数自己调用自己的行为叫做递归,可能导致出现死循环的效果
  递归可实现一种分治的算法思想,把一个复杂的大问题,分解成若干个相同的小问题,直到问题全部解决

    1、设置出口
    2、解决一个小问题
    3、调用自己

  递归函数每次调用自己都会在栈内存产生一份自己的拷贝,直到到达出口,才一层层释放,因此递归非常耗费内存,与循环相比速度非常缓慢,能用循环解决的问题就不要使用递归
递归优缺点:
  1、耗费内存、速度慢
  2、好理解、思路清晰
  3、可以解决非线性问题的执行过程

例1:使用递归模拟汉诺塔的移动过程

#include <stdio.h>

void hanoi(int n,char s,char t,char d)
{
    //s起点  t中转点  d终点
    if(1 == n)
    {
        printf("1 from %c to %c\n",s,d);
        return;
    }
    hanoi(n-1,s,d,t);
    printf("%d from %c to %c\n",n,s,d);
    hanoi(n-1,t,s,d);
}

int main(int argc,const char* argv[])
{
    hanoi(5,'A','B','C');
}

例2:用递归实现0~9的全排列

#include <stdio.h>

void whole(int arr[],int n,int m)
//	n是全排列的起点下标 m是元素个数
{
    if(n == m-1)
    {
        for(int i=0; i<m; i++)
        {
            printf("%d ",arr[i]);	
        }
        printf("\n");
        return;
    }
    for(int i=n; i<m; i++)
    {
        //交换所有的值到第n位
        int tmp = arr[i]; 
        arr[i] = arr[n];
        arr[n] = tmp;
        
        // 对后面n+1开始全排列
        whole(arr,n+1,m);
        
        //把值交换回第n位
        tmp = arr[i]; 
        arr[i] = arr[n];
        arr[n] = tmp;
        
    }
}

int main(int argc,const char* argv[])
{
    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    whole(arr,0,10);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值