一.实验目的
-
掌握递归程序设计的方法。明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计;
-
掌握递归程序转换为非递归程序的方法。
二.实验内容
用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。
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+"次");
}
}