用c语言计算简单的递归问题

时间:2024-05-22 14:31:06
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
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;
}用c语言计算简单的递归问题
#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;
}
 
用c语言计算简单的递归问题
#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;
}用c语言计算简单的递归问题