递归

一.实验目的

  1.  掌握递归程序设计的方法。明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计;
    
  2.  掌握递归程序转换为非递归程序的方法。
    

二.实验内容

用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。

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



package dg;

public class yz 

{

    static int sum;

    public static void main(String[] args)

    {

        int n=1;

        int num;//每个村子卖出的鸭子数

        int sum=one(n);  
//刚开始的鸭子数,n个村子

        System.out.println("刚开始有"+sum+"只鸭子");

        for(int i=1;i<8;i++)//循环输出经过每个村子卖出的鸭子数

        {

           num=sum/2+1;

           sum-=num;  //剩余鸭子数

           System.out.println("经过第"+i+"个村子卖出了"+num+"只鸭子,还剩下"+sum+"只鸭子");

        }

    }

    public static int one(int n)

    {

        if(n<8)

        {

           return 2*(one(n+1)+1);

        }

        else if(n==8)

        {

           return 2;

        }

        return n;

    }

}




package dg;

 

public class yz1

{

    static int sum=2;//鸭子总数

    public static void main(String[] args)

    {

        int num;

        for(int i=1;i<8;i++)

        {

           sum=(sum+1)*2;//循环计算出鸭子总数

        }

        System.out.println("一共有"+sum+"只鸭子");

        for(int i=1;i<8;i++)

        {

           num=sum/2+1;

           sum-=num;

           System.out.println("经过第"+i+"个村子卖了"+num+"只鸭子,还剩"+sum+"只鸭子");

        }

    }

}

 




package dg;

import
java.util.Scanner;

public class jg {

    static int sum=0; //计算次数

    public static void main(String[] args)

    {

        Scanner sc=new Scanner(System.in);

        System.out.print("请输入一个自然数:");

        int x=sc.nextInt();

        sc.close();

        int sum=one(x);

        System.out.println();

        System.out.println("一共经过了"+sum+"次");

        

    }

    public static int one(int x)

    {

        if(x==1)   //输入的自然数为1

        {

           System.out.print(x+" ");

           sum++;  

        }

        else if(x%2==0)   //输入的自然数为偶数

        {

           System.out.print(x+" ");

           one(x/2);//将这个数有限次除以2

           sum++;

        }

        else if(x%2!=0)   //输入的自然数为奇数

        {

           System.out.print(x+" ");

           one(x*3+1); //将这个数有限次乘以3再加1

           sum++;

        }

        return sum;

    }

}




package dg;

import
java.util.Scanner;

public class jg1 {

    static int sum=0;

    public static void main(String[] args)

    {

        Scanner sc=new
Scanner(System.in);

        System.out.print("请输入一个自然数:");

        int x=sc.nextInt();

        sc.close();

        while(x>=1)

        {

           if(x==1)

           {

               sum++;

               System.out.println(x);

               break;

           }

           else if(x%2==0)

           {

               System.out.print(x+" ");

               sum++;

               x=x/2;

               

           }

           else if(x%2!=0)

           {

               System.out.print(x+" ");

               sum++;

               x=x*3+1;

           }

        }

        System.out.println("一共经过了"+sum+"次");

    }

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值