递归版——求组合数(低效版、高效版)

题目: 组合数

请编写递归函数,求组合数
在这里插入图片描述

说明:x 和 y 是任意整数。若 x ≥ y ≥ 0,则函数值为组合数
C
​x
​y
否则函数值为 0。

// 求组合数(递归版)
double Cmb(int x, int y);

裁判程序

#include <stdio.h>

// 求组合数(递归版)
double Cmb(int x, int y);

int main()
{
    int m, n;
    scanf("%d%d", &m, &n);
    printf("%g\n", Cmb(m, n));
    return 0;
}

/* 你提交的代码将被嵌在这里 

我的代码(低效版

double Cmb(int x, int y)
{
	if( x < 0 || y < 0 || x < y )
	{
		return 0;
	}
	if( y == 0 || x == y )
	{
		return 1;
	}
	if( x >= y && y >= 0 )
	{
		return Cmb( x - 1, y ) + Cmb( x - 1, y - 1 );
	}
}

我的代码(高效版

double Cmb(int x, int y)
{
	double m;
	if( x < 0 || y < 0 || y > x )
	{
		m = 0;
	}
	else if( y == 0 )
	{
		m = 1;
	}
	else if( y > x / 2 )
	{
		y = x - y;
		m = Cmb( x , y );
	}
	else
	{
		m = x * Cmb( x - 1, y - 1) / y;
	}
	return m;
}

知识点&&代码闪光点&&思路

1.低效版实则就是参考杨辉三角(任意一个数的值等于其上方两个数之和(塔顶元素和每一排首尾元素值为1))
由于是初学递归算法,个人总结了自己写递归的思路

  • 首先把特殊的情况表示出来
  • 其次找出所求的解与前面几项的关系(类似于数学中的通项公式)
  • 调试程序
    在这里插入图片描述在这里插入图片描述
    2.高效版则是运用了数学方面的知识,
    当n的值过大时,通过转换将n变为n = m - n,大量的减少了计算量,使代码达到高效
    在这里插入图片描述
  • 19
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值