1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
3日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
#include<stdio.h>
int i=0,a; //定义i为将输入的的数字计算到1所需要的步数,a为输入的自然数
int jiaogu(int a) //定义递归函数
{
if (a==1)
{ printf("经过了第%d次计算使所输入的自然数为1.\n",i+1); //当a的值为1时递归终止
return 0;
}
else
{
if(a%2==0) //判断所输入的a的值是偶数还是奇数,便于利用角谷定理
{
a=a/2;
i=i+1;
return jiaogu(a);
}
else
{
a=a*3+1;
i=i+1;
return jiaogu(a); //递归公式
}
}
}
int main()
{
printf("请输入一个自然数:\n");
scanf("%d",&a);
jiaogu(a);
return 0;
}
int i=0,a; //定义i为将输入的的数字计算到1所需要的步数,a为输入的自然数
int jiaogu(int a) //定义递归函数
{
if (a==1)
{ printf("经过了第%d次计算使所输入的自然数为1.\n",i+1); //当a的值为1时递归终止
return 0;
}
else
{
if(a%2==0) //判断所输入的a的值是偶数还是奇数,便于利用角谷定理
{
a=a/2;
i=i+1;
return jiaogu(a);
}
else
{
a=a*3+1;
i=i+1;
return jiaogu(a); //递归公式
}
}
}
int main()
{
printf("请输入一个自然数:\n");
scanf("%d",&a);
jiaogu(a);
return 0;
}
#include<stdio.h>
int k=2; //k为经过不同村子时所拥有的鸭子数 ,k=2位经过第7个村子后的鸭子数目
int Sell(int i) //定义递归函数
{ int n;
if (i==0) // i为村子数,n为经过不同村子卖出的鸭子数目,k为经过不同村子时所拥有的鸭子数
{
printf("他出发时共赶的鸭子总数为:%d\n",k); //递归终止条件
return 0;
}
else
{
k=(k+1)*2;
n=k/2+1;
printf ("他经过第%d个村子卖出的鸭子为:%d\n",i,n); // 递归公式
return Sell(i-1);
}
}
int main()
{ Sell (7);
return 0;
}
int k=2; //k为经过不同村子时所拥有的鸭子数 ,k=2位经过第7个村子后的鸭子数目
int Sell(int i) //定义递归函数
{ int n;
if (i==0) // i为村子数,n为经过不同村子卖出的鸭子数目,k为经过不同村子时所拥有的鸭子数
{
printf("他出发时共赶的鸭子总数为:%d\n",k); //递归终止条件
return 0;
}
else
{
k=(k+1)*2;
n=k/2+1;
printf ("他经过第%d个村子卖出的鸭子为:%d\n",i,n); // 递归公式
return Sell(i-1);
}
}
int main()
{ Sell (7);
return 0;
}
#include<stdio.h>
int A; //A为原来每个孩子手里的橘子数,b为从别人那里得到的橘子数
int b=210; //b的初值为210,可计算出第六个孩子得到橘子后共有420*3/2=630个橘子,
// 给了第一个孩子630/3=210个橘子
int juzi(int i)
{
if(i==7)
{
//递归终止条件
return 0;
}
if(i==1)
{
A=(420-b)*(9-i)/(8-i); //第一个孩子为特例,从第六个孩子计算出第一个孩子(420-b)*8/7=240个
b=1/(9-i)*b;
printf("第1个孩子原来的橘子数为%d:\n",A);
return juzi(i+1);
}
else
{ A=420*(9-i)/(8-i)-b;
b=1/(9-i)*(A+b);
printf("第%d个孩子原来的橘子数为%d:\n",i,A);
return juzi(i+1); // 递归表达式
}
}
int main()
{
juzi(1);
return 0;
}
int A; //A为原来每个孩子手里的橘子数,b为从别人那里得到的橘子数
int b=210; //b的初值为210,可计算出第六个孩子得到橘子后共有420*3/2=630个橘子,
// 给了第一个孩子630/3=210个橘子
int juzi(int i)
{
if(i==7)
{
//递归终止条件
return 0;
}
if(i==1)
{
A=(420-b)*(9-i)/(8-i); //第一个孩子为特例,从第六个孩子计算出第一个孩子(420-b)*8/7=240个
b=1/(9-i)*b;
printf("第1个孩子原来的橘子数为%d:\n",A);
return juzi(i+1);
}
else
{ A=420*(9-i)/(8-i)-b;
b=1/(9-i)*(A+b);
printf("第%d个孩子原来的橘子数为%d:\n",i,A);
return juzi(i+1); // 递归表达式
}
}
int main()
{
juzi(1);
return 0;
}