一.题目分析
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代码,才想到了上面的函数表达式。当然,写出了递归体,翻译代码就变得简单多了。