递归地推练习 F 6. 计算组合数

DESCRIPTION:

给了 一段话:

计算组合数。C(n,m),表示从n个数中选择m个的组合数。
计算公式如下:
若:m=0,C(n,m)=1
否则, 若 n=1,C(n,m)=1
             否则,若m=n,C(n,m)=1
                         否则 C(n,m) = C(n-1,m-1) + C(n-1,m).

 

看到 这段话,想都没有想 用递归直接做了,提交之后 ,he,还没有超时。

#if  0   // f 6      计算组合数问题  没有用 记忆搜索
#include<bits/stdc++.h>
using namespace std;
int fun(int n,int m)
{
 if(n==m) return 1;
 else
 if(m==0) return 1;
 else
 if(n==1) return 1;
 else return   fun(n-1,m-1)+fun(n-1,m);
  
 
}
int main()
{
 int x,n,m;
 cin>>x;
 for(int i=1;i<=x;i++)
{
 cin>>n>>m;
 cout<<fun(n,m)<<endl;
 
}
 
}
#endif


根据记忆搜索的方法,定义了一个数组,用来 存 已经算出来的 数字,改进了一下,

#if  0                      
#include<bits/stdc++.h>
using namespace std;
int a[21][21]={0};
int fun(int n,int m)
{
 if(n==m) return 1;
 else
 if(m==0) return 1;
 else
 if(n==1) return 1;
 if(a[n][m]) return a[n][m];
 else {
  a[n][m]=fun(n-1,m-1)+fun(n-1,m);
  return a[n][m];
   
}
 
}
int main()
{
 int x,n,m;
 cin>>x;
 for(int i=1;i<=x;i++)
{
 cin>>n>>m;
 cout<<fun(n,m)<<endl;
 
}
 
}
#endif




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当需要用C语言递归求和1到n时,可以使用以下代码: ```c #include <stdio.h> int sum(int n) { if(n == 1) { return 1; } else { return n + sum(n-1); } } int main() { int n; printf("请输入n的值: "); scanf("%d", &n); int result = sum(n); printf("1到%d的和为%d\n", n, result); return 0; } ``` 该代码定义了一个递归函数`sum()`,它将参数n作为输入,返回1到n的和。在`sum()`函数中,如果n等于1,则返回1;否则,递归调用`sum()`函数,将n-1作为新的参数传递,并将返回值与n相加。 在`main()`函数中,先读入n的值,然后调用`sum()`函数计算1到n的和,最后输出结果。 ### 回答2: C语言递归求和1 2 3 …… n的方法是通过递归函数来逐个相加,直到n为0时返回0,否则递归调用函数f(n-1)再加上n。具体实现代码如下: ```c #include<stdio.h> int getSum(int n) { if(n <= 0) { //递归终止条件 return 0; } else { //如果n不等于0,则递归调用自己并加上n return getSum(n-1) + n; } } int main() { int n, sum; printf("请输入一个正整数n:"); scanf("%d", &n); sum = getSum(n); printf("1+2+3+...+%d=%d\n", n, sum); return 0; } ``` 运行结果: 请输入一个正整数n:10 1+2+3+...+10=55 在这个程序中,我们定义了int类型的函数getSum,它以一个整数n作为参数。如果n小于等于0,函数直接返回0,否则,函数再递归调用自己,并将getSum(n-1)的结果与n相加后返回。而在主函数中,我们输入一个正整数n,将其传递给getSum函数,并将函数的返回值赋值给sum,最后输出结果。运用递归方法能够简洁地实现此功能。 ### 回答3: 递归是一种经典的编程思想。在C语言中,递归可以帮助我们解决很多问题,包括求和1到n的问题。递归的关键在于将问题分解为更小的子问题,直到达到最简单的形式。然后,我们可以将结果逐步传递回来,逐步解决原始问题。 对于求和1到n的问题,我们可以将其分解为两个部分:首先,使用递归将n降低到1或0;第二,将其回溯并在途中添加n。 下面是通过递归完成求和1到n的代码: ``` #include <stdio.h> int sum(int n){ // 处理简单情况 if(n == 0 || n == 1){ return n; } // 递归调用子问题 else { return sum(n-1) + n; } } int main(){ int n, result; printf("请输入n的值:\n"); scanf("%d", &n); result = sum(n); printf("1到%d的和为:%d", n, result); return 0; } ``` 在上面的代码中,我们定义了一个名为sum的函数来处理递归。首先,我们针对特殊情况进行处理。这里我们只需要让n为0或1时,函数直接返回n的值。接下来我们开始递归调用,将n递减1,并将其结果加上n。最后,在main函数中,我们只需要输入n的值,调用sum函数,就可以得到1到n的和。 当我们输入10时,输出为:1到10的和为:55 递归可以非常简洁地解决这个问题。但是,递归的缺点也是显而易见的,它需要更多的内存和计算时间。所以,我们要权衡情况,选择最恰当的解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值