递归程序设计(Java)

一.题目分析

1.赶鸭子问题。由题目中经过第7个村子后鸭子还 剩2只可知,第8个村子有2只鸭子。假设在第n个村子有f(n)只鸭子,那在该村卖出了f(n)/2+1只,剩余的鸭子赶往下一个村子,即f(n+1)只。所以第n村的鸭子数为f(n)=f(n)/2+1+f(n+1),即f(n)=2*(f(n+1)+1)只。

二.算法构造

1赶鸭子问题
递归出口:f(n)=f(8)=2;
递归体:f(n)=2*(f(n+1)+1)

三.算法实现

赶鸭子问题

public class Test5 {
		public static int duck(int n){
			int num=0;
			if(n==8){//递归出口
				return 2;
			}
			else{//递归体
				for(int i=n;i>0;i--){
				num=2*(duck(n+1)+1);
				}
				return num;
			}
		}
		public static void main(String args[]){
			for(int j=1;j<8;j++){
				System.out.println("经过第"+j+"个村子有"+duck(j)+"只鸭子,卖了"+(duck(j)/2+1)+"只");
			}
		}
}

四.运行结果

在这里插入图片描述

题目分析

2.角股定理。输入一个自然数,如果是偶数,则把它除2,若是奇数,则把它乘以3加1,总能得到1.所以递归在数为1时结束。

算法构造

递归出口: f(n)=1;
递归体: n/2 , n为偶数
f(n)=
3*n+1, n为奇数

算法实现

import java.util.Scanner;
public class Test4 {
	public static void main(String args[]){
		System.out.println("请输入一个自然数:");
	Scanner sc=new Scanner(System.in);
	int m=sc.nextInt();
	int count=mfl(m,1);
	System.out.println("step="+count);
	
	}
	public static int mfl(int m,int num){
		if(m==1){
			System.out.println(m);
			return num;
			}
		if(m%2==0){
			System.out.println(m);
			m=m/2;
			num++;
			return mfl(m,num);
		}
		else{
			System.out.println(m);
			m=3*m+1;
			num++;
			return mfl(m,num);
		}
	}
}

运行结果

在这里插入图片描述
在这里插入图片描述

经验归纳

本次实验的关键点在于递归出口及递归体的实现。不论是赶鸭子还是角股定理都是要设计出递归条件,这也是最难的一步,刚开始赶鸭子问题自己并没有一下就想出递归体,所以先做了角股定理,这道数学问题还是比较容易能从题目就看出递归出口和递归体。根据递归体很容易就翻译出了代码,而赶鸭子问题确实想的比较久,一开始只想到根据剩余的2只鸭子从后往前推,但想不到递归函数怎么写,后来也是参考了CSDN代码,才想到了上面的函数表达式。当然,写出了递归体,翻译代码就变得简单多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值