递归算法-买鸭子(c++,java)

一.题目
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
二.题目分析
1.题目分析:首先,我们设n个村庄,共有X(n)只鸭子。在第一个村庄卖了X(n1)=(X(n)/2+1)只鸭子,在第二个村庄卖鸭子的数量为:X(n2)=(X(n)-X(n1))/2+1……以此类推,可得出:X(n-1)=(X(n)+1)*2。
递归出口为:X(7)=2; n=7
递归体为:X(n-1)=(X(n)+1)*2。n<7
2.题目分析:对于前面的判断是奇数还是偶数,然后进行相关的操作,这个相对容易。对于有限次运算之后,后面进行总可以得到自然数值1,这个就是用递归去实现。每次判断完就次数加1。
递归出口:输出次数以及对应的num, num=1
递归体为:Theory(num,count), num!=1
三.完整代码
1.Java:

public class DuckSum {
    public static void main(String[] args) {
        int sum=0;//鸭子总数
        int village=7;
        sum=Duck(village);
        System.out.println("一共有"+sum+"只鸭子。");

        int sale;//卖出去的鸭子数
        int rest;//剩余的鸭子数
        for(int v=7;v>=1;v--){
            sum=Duck(v);
            sale=sum/2+1;
            rest=sum-sale;
            System.out.println("进入第"+(8-v)+"个村庄,卖了"+sale+"只鸭子,剩余"+rest+"只鸭子!");
        }
    }
    public static int Duck(int count){
        if(count==0){
            return 2;
        }else{
            count--;
            return (Duck(count)+1)*2;
        }
    }
}

c++:

#include<iostream>
using namespace std; 
//定义递归算法 
int Duck(int count)
{  //count其实就是村子的总数  	
    if(count==0){
         //当所有村子都走完  		
          return 2;	 
    }else{
    	 	count--;	 	
    	 	return (Duck(count)+1)*2;	 
    } 
 }  
  
  //主函数 int main()
  { 
  	int sum=0;//鸭子总数	
  	int village=7;//村子总数	
  	sum=Duck(village);	
  	cout<<"一共赶了"<<sum<<"只鸭子!"<<endl;
  	
  	int sale;//卖的鸭子数	
  	int rest;//剩余的鸭子数 	
  	for(int count=7;count>=1;count--){
  			sum=Duck(count);		
  			sale=sum/2+1;		
  			rest=sum-sale;		
  			cout<<"经过第"<<8-count<<"个村庄时,卖了"<<sale<<"只鸭子,还剩余"<<rest<<"只鸭子。"<<endl;	
  	 }  	
  	 return 0;
  } 

2.Java:

import java.util.Scanner;
public class 角谷定理 {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int num=in.nextInt();
        System.out.println("下面是每一次运算后的结果:"+"\n");
        Theory(num,1);
    }
    public static void Theory(int num,int count){
        System.out.println(num);
        if(num%2==0)//num为偶数
            num/=2;
        else if(num%2!=0&&num!=1)//num为奇数
            num=num*3+1;
        count++;
        if(num!=1)//若结果不为1,就继续递归函数,直到为1结束
            Theory(num,count);
        else if(num==1){//若结果为1,就输出次数以及num
            System.out.println(num);
            System.out.println("一共有"+count+"次!");
        }
    }
}

c++:

#include<iostream>
using namespace std;
void Theorem(int num,int count)
{ //count为次数     
   cout<<num<<endl;//将每次运算前的结果输出来 	
   if(num%2==0)//num为偶数 	
   	num=num/2;	 
   else if(num%2!=0&&num!=1)//num为奇数 	
   	num=num*3+1;	
   count++;	
   if(num!=1)//如果结果不等于1,继续运算 		
        Theorem(num,count);	
   if(num==1){//如果为1,则输出结果 		
        cout<<num<<endl;		
        cout<<"次数为"<<count<<endl;	
   } 	
 }  

int main(){
	int num;	
	cin>>num;//输入一个数	
	cout<<"下面就是每运算一次的结果:"<<endl;	
	Theorem(num,1);	
	return 0;
}

四.调试
1.
在这里插入图片描述
在这里插入图片描述
2.
在这里插入图片描述
在这里插入图片描述
五.测试
1.c++
在这里插入图片描述
2.c++
在这里插入图片描述
最后,可能过程不尽完善,望采纳!有批评意见请指出!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值