赶鸭子问题
題目:趕鴨子問題
一.題目分析
? ? ? ? 用遞歸方法設計下列各題,并給出每道題目的遞歸出口(遞歸結(jié)束的條件)和遞歸表達式。同時考慮題目可否設計為非遞歸方法,如果可以,設計出非遞歸的算法。
? ? ? ? 一個人趕著鴨子去每個村莊賣,每經(jīng)過一個村子賣去所趕鴨子的一半又一只。這樣他經(jīng)過了七個村子后還剩兩只鴨子,問他出發(fā)時共趕多少只鴨子?經(jīng)過每個村子賣出多少只鴨子?
? ? ?? 分析思路:從后向前推測,最后剩余鴨子兩只,每次相對于上一次來說,剩余x-(x/2+1)只鴨子。
?
二.算法設計
? ? ? 采用遞歸函數(shù)f(n)來完成整個過程,因為每次的過程步驟都相同,因此用同一個函數(shù)反復調(diào)用即可,最后給出一個結(jié)束條件,就是村莊數(shù)超過8時,遞歸調(diào)用結(jié)束。
?
三.源代碼
package duck_qustion;import java.util.Scanner;public class Duck{//用循環(huán)法/*一個人趕著鴨子去每個村莊賣,每經(jīng)過一個村子賣去所趕鴨子* 的一半又一只。這樣他經(jīng)過了七個村子后還剩兩只鴨子,問他* 出發(fā)時共趕多少只鴨子?經(jīng)過每個村子賣出多少只鴨子?*/public static void main(String[] args) {// TODO Auto-generated method stubcount();}public static void count() {int sub_duck = 2;int sum = 0 ;int duck = 2;for(int s = 0;s<7;s++) {duck = (duck + 1) * 2;}sum = duck ;System.out.println("鴨子的總數(shù)為" + sum);System.out.println("請輸入需要查詢的村莊序號");@SuppressWarnings("resource")Scanner input = new Scanner(System.in);int n = input.nextInt();for (int i = 0; i < (7 - n); i++) {sub_duck = (sub_duck + 1) * 2;}System.out.println("經(jīng)過第 " + n + "個村莊時,剩余鴨子的個數(shù)為" + sub_duck);} }四.運行,調(diào)試截圖
運行截圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 圖1
調(diào)試截圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 圖3
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖4
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖5
?
五.心得體會
? ? ?? 使用遞歸調(diào)用時,優(yōu)點在于代碼量少,使得代碼有更高的可讀性,開起來不繁瑣,但是缺點在于效率沒有非遞歸的效率高,并且代碼的可讀性不高,對于判斷遞歸的出口不易判斷。
? ? ?? 使用非遞歸調(diào)用時,優(yōu)點在于效率比遞歸的效率高,并且代碼的可讀性高,容易理解。缺點在于代碼量多,使得代碼沒有良好的可讀性,看起來過于冗雜。
? ? ?? 此次的程序使我對于遞歸和非遞歸的理解更深刻,在實際題目中的運用更熟練。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
- 上一篇: 美国人乐观的隐患
- 下一篇: 常用编码与为何要encode和decod