阶乘、猴子摘桃和水手椰子

#include <iostream>
using namespace std;
int fact(int n);
int fact_r(int n);
int Yezhi(int n);
int getPeachNumber(int n);
int pickPeach(int n);

int main()
{
cout<<"阶乘迭代与递归:"<<endl;
cout<<fact(5)<<endl;
cout<<fact_r(5)<<endl;
cout<<"猴子摘桃迭代与递归:"<<endl;
cout<<getPeachNumber(1)<<endl;
cout<<pickPeach(1)<<endl;
cout<<"水手椰子迭代与递归:"<<endl;
cout<<Yezhi(1)<<endl;
return 0;
}
int fact(int n){
int i,num=1;
for(i=1;i<=n;i++)//迭代起点: 1,所以初值i=1,则所求n为另一界 ,为前进方向,即初值1-->n(n>1),则i++
num=num*i;
return num;
}
int pickPeach(int n){
int i,num=1;
for(i=10;i>n;i--)//迭代起点:10 ,所以初值i=10,则所求n为另一界,为前进方向,即初值10-->n(n<10),则i--
{
num=2*(num+1);
}
return num;
}
int Yezhi(int n){//要从上述两列概况总结出写法,只不过初值j需穷举,外圈在多一个for
int i,j,num=0;
for(j=1;;j++)
{
num=5*j+1;
for(i=5;i>n;i--)
{
num=5*num/4+1;
if(num%5!=1)
break;
}//循环结束意味着到第1个水手,若整除5余1,break结束外圈测试第5个人每一份个数j是对的
if(num%5==1)
break;
}
return num;
}
//由于上述j没有界,最好用while或do while循环,自己写,下面的写法没有按概况总结的规律写,不好,应确定起点i=5为初值
int Num(int n){
int i,j=0,num=0;
do{
j++;//假设最后每一份首先是1个,当然推第二个时若不能整除,则最后每一份不能是1,然后++,穷举
num=5*j+1;
for(i=2;i<=n;i++)//把第5个人看成第1个,也能算,但题中就是第5,还是按上面的for
{
num=5*num/4+1;//倒序看,a1=6,a2=5*6/4+1=8
if(num%5!=1)//判断ai也就是num是否整除5余1,如果不是说明整型除有省略
{
printf("j=%d时a%d的个数是%d\n",j,i,num) ;
break;//跳出for循环,也就是重新假设a1=2+2+2+2+2+1为初值重新计算
}
}
if(i>n)
printf("最后一个人每一份有j=%d时a%d的个数是%d\n",j,i-1,num) ;//能执行此句说明迭代4次的数都能除以5余1
}while(num%5!=1); //满足所有的都能整除5余1退出do循环,即找到

return num;
}

int fact_r(int n)
{
if(n==1)//n=1终止条件
return 1;
else
return n*fact_r(n-1);//f(n)用f(n-1)表示,向着终止条件前进,不用f(n+1)表示
}
int getPeachNumber(int n){//计算第n天桃子的数量
if(n==10)//n=10终止条件
return 1;
else
return (getPeachNumber(n+1)+1)*2;//f(n)用f(n+1)表示,同样向着终止条件前进,不用f(n-1)表示

}

posted @ 2026-04-01 09:15  师大无雨  阅读(4)  评论(0)    收藏  举报