经典递归问题

在n个球中取m个(不放回),求有多少种取法
通过增加变量,来实现递归,增加一个特殊球,分为取到这个特殊球和没有取到这个特殊球

int combination(int n,int m)
{
    if(n<m)
        return 0;
    if(n==m)
        return 1;
    if(m==0)
        return 1;
    return combination(n-1,m) + combination(n-1,m-1);
}

求n个元素的全排列

void Swap(int data[],int i,int j)
{
    int t = data[i];
    data[i] = data[j];
    data[j] = t;
}
// k 是当前的交换位置(关注点),k与其后的元素交换
void f(int array[],int k)
{
    if(k == strlen(array)-1)
        printf("%s",array);
    for(int i=k;i<strlen(array);i++)
    {
        swap(array,i,k);
        f(array,k+1);
        swap(array,i,k);    
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
车厢调度问题是一个经典递归问题,其实质是求解给定一列车厢,将其从出发状态调度到目标状态的所有可能调度方案。 具体来说,我们可以将车厢调度问题转化为以下问题:给定一个初始状态和目标状态,每次可以将初始状态中最上面的车厢移动到一个辅助轨道中,或从辅助轨道中移回一个车厢放到初始状态中的某个位置。求解从初始状态到目标状态的所有可能方案。 递归求解车厢调度问题的思路如下: 1. 如果初始状态和目标状态相同,那么这个问题已经被解决了,直接返回即可。 2. 否则,我们可以将初始状态中最上面的车厢移动到辅助轨道中,并递归求解从剩余的车厢和辅助轨道到达目标状态的所有可能方案。 3. 接着,我们将辅助轨道中最上面的车厢移回初始状态的某个位置,并递归求解从剩余的车厢和辅助轨道到达目标状态的所有可能方案。 4. 重复步骤 2 和 3,直到所有可能的方案都被考虑过。 需要注意的是,在递归求解车厢调度问题时,我们需要记录当前的状态以及已经移动到辅助轨道中的车厢,以便在移回车厢时能够正确地还原状态。此外,为了避免重复计算,我们可以使用记忆化搜索技术,对已经求解过的状态进行缓存,以便下次直接返回结果。 总之,递归求解车厢调度问题需要注意细节,但其思路相对简单清晰,是一个很好的经典递归问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值