递归

赶鸭子
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
#include<iostream.h>
//经过第几个村子所剩余的鸭子数
int leftduck(int n){ // n为经过的村子数
if(n7)
return 6-(6/2+1);//第七个村庄剩余2只
else
return (leftduck(n+1)*2)+2;
}
//计算经过每个村子卖出的鸭子数
int sellduck(void) {
int i=7;
for(i;i>0;i–){
cout<<“第”<<i<<“村庄卖出鸭子数为:”<<(leftduck(i-1)/2+1)<<endl;//卖出数为前一个村庄剩余数除2加1
}
return 0;
}
int main(){
cout<<“出发时共赶鸭子为:”<<leftduck(0)<<endl;//出发前的鸭子数为第0个村子剩余的鸭子数
sellduck();
}
角谷定理
角谷定理。输入一个自然数,若为偶数,则把它除以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<iostream.h>
int static i=1;//最开始还未执行时步数为1
int step(int n){
if(n
1){
cout<<n;//数字为1,直接结束
return i;//步骤为1
}
if(n%20){
cout<<n<<" “;
step(n/=2);//为偶数除2
i++;
}
else{
cout<<n<<” “;
step(n=n3+1);//为奇数乘以3加1
i++;
}
}
int main(){
int number;
cout<<“please input a number:”<<endl;
cin>>number;
step(number);
cout<<endl<<“step=”<<i<<endl;
return 0;
}
电话号码
电话号码对应的字符组合:在电话或者手机上,一个数字如2对应着字母ABC,7对应着PQRS。那么数字串27所对应的字符的可能组合就有3
4=12种(如AP,BR等)。现在输入一个3到11位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
#include<iostream.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
char* letter[10]={”","",“ABC”,“DEF”,“GHI”,“JKL”,“MNO”,“PQRS”,“TUV”,“WXYZ”};//每个数字代表的字符
int num[10]={0,0,3,3,3,3,3,4,3,4};//每个数字代表的字符个数
char input[20];//保存输入电话字符数组
char output[20];//输出可能字符组合
void RS(int t,int length)
{
if(t
length)
{
cout<<output<<endl;
}
for(int i=0; i<num[input[t]]; i++)
{
output[t] = letter[input[t]][i];
RS(t+1,length);
}
}
int main()
{
int length;//储存电话号码
printf(“输入一个3到11位长的电话号码:”);
scanf("%s",input);
printf(“该电话号码所对应字符的所有可能的组合:\n”);
length = strlen(input);
int total = 1;
for(int i=0; i<length; i++)
{
input[i] -= ‘0’;
total *= num[input[i]];
}
RS(0,length);
cout<<“组合数:”<<total<<endl;
return 0;
}
分橘子
日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?
#include<iostream.h>
int orange(int i,int j,int n){ //i代表原有的橘子数量, j代表前n-1一个人给的橘子数,n代表老几
int m=0;
if(n>5){
return 0;
}
else{
//计算分给下一个数目
if(n==1){ //第一个人是先直接给
cout<<“老”<<n<<“原来的橘子数:”<<i<<endl;
m=i/(9-n);
j=m;
}
else{ //先得到后再给
int m=(i+j)/(9-n);//当前给出的橘子数
j=m;

	}
		//下一个人原来的橘子数
		int i=420*(8-n)/(7-n)-j;
		cout<<endl<<"老"<<n+1<<"原来的橘子数:"<<i<<endl;
		n=n+1;
		orange(i,j,n);	  
}

}
int main(){
orange(240,210,1);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值