利用递归设计算法计算第20个斐波那契数
算法分析:
斐波那契数列:第1,2两个数为1,1.从第3个数开始,该数是其前面两个数之和。
/*
利用递归设计算法计算第20个斐波那契数。
*/
#include <iostream>
using namespace std;
int Fibonacci(int n)
{
if (n == 1 || n ==2)
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
int main()
{
int n, acc;
cout<<"请输入n的值:\n";
cin>>n;
acc = Fibonacci(n);
cout<<"第"<<n<<"个;斐波那契数列数是:"<<acc<<endl;
system("pause");
}
利用递归设计算法求解10!
1.算法分析:
10!=10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
N!=n(n-1)(n-2)……
可知当n=0,1是等于1
n>=2时,进行递归运算
/*
利用递归设计算法求解10!
*/
#include <iostream>
using namespace std;
int fun(int n)
{
if (n == 0 || n == 1)
return 1;
else
return n * fun(n-1);//N!=n(n-1)(n-2)……
}
int main()
{
int n,mul;
cout<<"请输入n的值:\n";
cin>>n;
mul = fun(n);
cout<<n<<"的阶乘是"<<mul<<endl;
system("pause");
}
(1)运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。
1.算法分析:
第一天发1+(f(n,1)-1)/7枚金牌,第二天发金牌2+(f(n,2)-2)*1/7,依次类推:
设第一天的金牌数量为f(n-1),发金牌的数量为1+(f(n,1)-1)/7,第二天的金牌数量为f(n-2),发的金牌数量为2+(f(n,2)-2)*1/7,则有f(n-2)=f(n-1)- 1+(f(n,1)-1)/7,类推得f(n-i)=f(n,i-1)-i-(f(n,i)-i)/7;
#include <iostream>
using namespace std;
//定义每一天发放奖牌从剩余的部分来源得几分之几
//此处为7
#define Fenmu 7
//创建递归函数,nMedalSum为第N天奖牌总数,包括当天分发的和剩余的两部分之和
int nMedalSum(int i, int n)
{
int result = 0;
if (i == n)
{
result = Fenmu - 1;
}
else{
result = (nMedalSum(i+1,n)*Fenmu/(Fenmu-1)+i);
}
return result;
}
void main()
{
int n=Fenmu-1; // 金牌数量必须是6的倍数,此时为6枚
int m; //
for (int i=1; i<=n; i++)
{
//第i天时金牌发完
if ( nMedalSum(i,n)%(Fenmu-1)==0){
if(n==i){
break;
}
}
else{
//6不合适,取6的倍数,例如12,18,24........
n=n+Fenmu-1;
}
}
cout<< "金牌发放了" << n << "天" << ",总金牌数是:" << nMedalSum(1,n) << "枚" << endl << endl;
cout<< "每天发放的金牌数为:"<< endl << endl;
for(int j=1;j<=n;j++){
cout << "第"<< j << "天发放金牌数是:" <<j << "+" << (nMedalSum(j,n)-j)/7 << "还剩" << (nMedalSum(j,n)-j)/7*6 << "枚"<< endl;
}
cout << endl;
system("pause");
}
本人小白,如果有更好的代码,欢迎留言告知!