递归程序设计

来源:互联网 发布:软件开发 书籍 知乎 编辑:程序博客网 时间:2024/05/22 08:18
1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
#include <stdio.h> int duck(int v) {  if(v==7)  return 2;  return (duck(v+1)+1)*2; } void main(){int sum=duck(0);int sell=0;printf("出发时共赶%d只鸭子\n",sum);for(int i=1;i<=7;i++){sell=sum-duck(i);sum=duck(i);printf("经过第%d个村子卖出鸭子: %d\n",i,sell);}  printf("\n"); }
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
#include<stdio.h>int step=1;int jiaogu(int a){if(a==1){printf("%d\n",a);return 1;        }else if(a%2==0){step++;printf("%d\n",a);return jiaogu(a/2);}else if(a%2!=0){step++;printf("%d\n",a);return jiaogu(a*3+1);}}void main(){int a=0;printf("输入一个自然数:\n");scanf("%d",&a);jiaogu(a);    printf("经过%d次可以的到自然数1\n",step);}
 3.电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3*4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
#include <iostream>using namespace std;char str[10][5]= {"", "", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"}; int size[10] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4};int tel_length;int number[11],answer[11];void RecursiveSearch(int *number,int *answer,int index,int n){if(index==n){for(int i=0;i<n;i++)cout<<str[number[i]][answer[i]];cout<<endl;return;}else{for(answer[index]=0;answer[index]<size[number[index]];answer[index]++){RecursiveSearch(number,answer,index+1,n);}}}int main(int argc,const char*argv[]){cin>>tel_length;for(int i=0;i<tel_length;++i)cin>>number[i];memset(answer,sizeof(answer),0);RecursiveSearch(number,answer,0,tel_length);return 0;}4.日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
#include<stdio.h>void sum(int orange[],int n){if(n<6)sum(orange,n+1);    orange[n]=orange[n]/(8-n)*(9-n)-orange[n-1]/(9-n);}//表示给出桔子前的桔子数目void main(){int orange[7]={0,420,420,420,420,420,420};   //六兄弟桔子一样多,各有420个orange[1]=orange[1]-orange[6]/2;             //老大的桔子有orange[6]/2来自老二sum(orange,1);printf("六兄弟原来手中分别有桔子:\n");for(int i=1;i<=6;i++)printf("%d\n",orange[i]);printf("\n");}
0 0