int main()
{
int i,N
double M,s,h=0,k//k用来保存输入的M值
scanf("%lf %d",&M,&N)
k=M
if(N==1)
{
h=M
s=M
}
else
for(i=1,s=0i<=Ni++)
{
s=s+3*M/2//这个s不知道你是用来干嘛的,所以没改
if(i==N)
{
h=h+M
}
else
{
h=h+M+M/2
}
M=M/2
//h=M
}
printf("小球从%.2f米的地方落下,经过三次落地经过的距离为%.2f米.%.2f\n",k,h,s)//这里会输出
return 0
}
if(n<m)return 0
如果总球数小于取出的球数,则返回0,比如一共有10个球,你要取出11个。显然是没法取,取法是0。
if(n==m)
return 1
如果总球数小于取出的球数,则返回1,比如一共有10个球,你要取出10个。只能全部取出,取法是1。
if(m==0)
return 1
取出0个球。取法也一种,那就是不取。
除了以上的情况,那么可以取出的方式,就是
总球数减一后,取出球数减一后,所有的组合。加上总球数减一后,取出球数不变的组合。
return f(n-1,m-1)+f(n-1,m)
重点是最后这一句。应该是一个递归调用。
也就是说,举个例子,如果从4个球里,取出3个。那么所有的取法,等于
3个球里取2个的所有取法,加上3个球里取3个的所有取法。
4个球里取3个。a,b,c,d,一共有abc,abd,acd,bcd 四种取法。
C4,3
3个球里取2个,a,b,c ,一共有ab,ac,bc三种。
3个球里取3个,a,b,c,一共有abc一种取法。
两边相等的,公式是成立的。
参考代码:
#include <stdio.h>int main()
{
int m,n,h,i
scanf("%d%d",&m,&n)
for(i=0,i<=ni++)
{
m/2
h+=m
}
printf("%d",h)//输出总路径
return 0
}