使用遞迴實現買汽水(華為面試題)

2021-08-04 13:11:28 字數 2166 閱讀 4487

今天老范問了我乙個問題

問題:

乙個人買汽水,一塊錢一瓶汽水,三個瓶蓋可以換一瓶汽水,兩個空瓶可以換一瓶汽水

問20塊錢可以買多少汽水?

注意:使用遞迴

這一題乍一看,哎喲,這麼簡單,能買幾瓶?恩。。

五瓶!

為啥啊?

多了我喝不完啊!

老范說,喝不完關你屁事,又不是給你喝

哦哦哦,那沒事兒了,我想想。

在知道自己的人生安全得到了保障之後,我冷靜下來仔細思考了如何用遞迴實現這個問題

首先想了想什麼是遞迴

方法內呼叫自己的方法的現象稱為遞迴呼叫

遞迴現象允許程式執行到某個階段時整體呼叫重新來過

以及遞迴的注意事項:

方法內部呼叫自己的方法不能100%成立,否則就是死迴圈

遞迴層數盡量少,因為會消耗記憶體,執行效率低

不能100%成立也就是說,要有終止條件,達成某個條件,就要跳出遞迴呼叫

瓶蓋和空瓶子換飲料,這是乙個怎麼樣的過程?了解了這個過程,才能分析出這中間哪些變數在發生變化,轉換,以及變化到哪個程度,就不滿足繼續遞迴的條件了,也就是滿足終止條件了。

(這是用processon畫的很好用)

(推薦一波,processon速打錢來!!!!!)

drink表示購買和置換的飲料

cup表示瓶蓋

bottle表示空瓶子

首先分析每乙個成員變數,

**所以置換的過程就是cup-3,drink+1 或者bottle-2,drink+1的過程。

所以遞迴呼叫的條件就是每一輪置換後,cup>=3||bottle>=2, &&drinks<1也就是跳出遞迴的條件是:每一輪置換後cup<3&&bottle<2 &&drinks<1**

因為在這個過程中,三個元素drink, cup, bottle都有連續的變化,所以遞迴呼叫時要將三個引數都傳就去。

定義方法體

`public static int soda(int drink, int cup, int bottle)

` 除了第一輪之外,每一輪的drink=cup/3+bottle/2, cup=cup%3, bottle=bottle%2

所以我本來是這麼寫的(錯的):

public

static

intsoda(int drinks,int caps,int bottles)else

}

得出來是93,我驚呆了,拿給老范,老范說,不不不還有更多,應該是113。

113,那就是說,我缺少20個,正好是第一輪拿錢買的20個。我分析了一下,發現這個**在第一次遞迴過程中,return soda(drinks,caps,bottles)+drinks 這後面跟的drinks已經被第二次置換的drinks替換掉了,導致少了第一次花20塊大洋買的drinks。

所以得調整順序

將drinks=caps/3+bottles/2的過程放在return內部

return soda(caps/3+bottles/2,caps,bottles)+drinks;

然後崩了,因為caps%=3;bottles%=2已經發生了,所以caps/3+bottles/2已經小於1了,直接滿足了終止條件跳出了迴圈

將這兩句調換順序並放在if前,這樣在每次遞迴時,首先將caps和bottles置換掉,之後再加上就不會影響drinks的置換數量。

caps%=3; bottles%=2;

caps+=drinks;bottles+=drinks;

然後我還發現,終止條件caps<3&&bottles<2&&drinks<1有點囉嗦,因為caps+=drinks;bottles+=drinks;只要drinks<1,就表示caps和drinks肯定滿足終止條件。

最終**:

public

static

intsoda(int drinks,int caps,int bottles)

else

}

得出113瓶。。。。

久久不能釋懷,感覺錯過了乙個億 v_v

華為面試題

1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...

華為面試題

三 1 區域性變數能否和全域性變數重名?答案 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域...

華為面試題

華為面試題 q1 請你分別划划osi的七層網路結構圖,和tcp ip的五層結構圖?q2 請你詳細的解釋一下ip協議的定義,在哪個層上面,主要有什麼作用?tcp與udp呢?q3 請問交換機和路由器分別的實現原理是什麼?分別在哪個層次上面實現的?q4 請問c 的類和c裡面的struct有什麼區別?q5 ...