赶鸭子问题
題目:趕鴨子問題
一.題目分析
? ? ? ? 用遞歸方法設計下列各題,并給出每道題目的遞歸出口(遞歸結束的條件)和遞歸表達式。同時考慮題目可否設計為非遞歸方法,如果可以,設計出非遞歸的算法。
? ? ? ? 一個人趕著鴨子去每個村莊賣,每經過一個村子賣去所趕鴨子的一半又一只。這樣他經過了七個村子后還剩兩只鴨子,問他出發時共趕多少只鴨子?經過每個村子賣出多少只鴨子?
? ? ?? 分析思路:從后向前推測,最后剩余鴨子兩只,每次相對于上一次來說,剩余x-(x/2+1)只鴨子。
?
二.算法設計
? ? ? 采用遞歸函數f(n)來完成整個過程,因為每次的過程步驟都相同,因此用同一個函數反復調用即可,最后給出一個結束條件,就是村莊數超過8時,遞歸調用結束。
?
三.源代碼
package duck_qustion;import java.util.Scanner;public class Duck{//用循環法/*一個人趕著鴨子去每個村莊賣,每經過一個村子賣去所趕鴨子* 的一半又一只。這樣他經過了七個村子后還剩兩只鴨子,問他* 出發時共趕多少只鴨子?經過每個村子賣出多少只鴨子?*/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("鴨子的總數為" + 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("經過第 " + n + "個村莊時,剩余鴨子的個數為" + sub_duck);} }四.運行,調試截圖
運行截圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 圖1
調試截圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 圖3
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖4
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖5
?
五.心得體會
? ? ?? 使用遞歸調用時,優點在于代碼量少,使得代碼有更高的可讀性,開起來不繁瑣,但是缺點在于效率沒有非遞歸的效率高,并且代碼的可讀性不高,對于判斷遞歸的出口不易判斷。
? ? ?? 使用非遞歸調用時,優點在于效率比遞歸的效率高,并且代碼的可讀性高,容易理解。缺點在于代碼量多,使得代碼沒有良好的可讀性,看起來過于冗雜。
? ? ?? 此次的程序使我對于遞歸和非遞歸的理解更深刻,在實際題目中的運用更熟練。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
- 上一篇: 美国人乐观的隐患
- 下一篇: python read_csv函数_Py