學的東西越多,反而覺得自己會的越少了。初次了解遞迴之後才發現,這是什麼神仙操作???然後樂此不疲,學不會,我就把你背會,敲會,一回生二回熟,慢慢也就理解了。
接下來放幾個小案例,送給傻乎乎努力的自己和正在努力的你。
希望對你有所幫助吧。
遞迴我聽過的最簡單但是也是最沒用的描述是:乙個方法自身呼叫自身。
但總歸對遞迴有了非常模糊的認識。
所有的迴圈基本都可以使用遞迴來實現。
遞迴的基礎思維是:
1、切蛋糕思維:將問題劃分成同種子問題,除了規模越來越小之外,其他的都一樣。非常經典的乙個案例就是:二分查詢法。
2、遞推公式或者等價轉換思維:當切蛋糕的方法用不了的時候,就可嘗試尋找問題的遞推公式或者問題的等價轉換。最經典的案例是斐波那契數列。
遞推公式是:f(n) = f(n-1) + f(n-2),其實這也是一種等價轉換,將f(n)轉換成求兩個子問題值,然後加起來。
1、找重複:寫第一次,後面的交給遞迴
2、找變化:變化的量作為引數
3、找邊界:出口,即結束遞迴的條件
在設計遞迴的時候先確定思維再按照三要素的先後順序來設計。即先找出結果再找到出口。
例如:陣列(int arr)求和的遞迴寫法
第一步確定思維:這個使用切蛋糕思維的話,你要考慮怎麼切第一刀,顯然很難下這第一刀啊,那就試試第二種思維。等價轉換,整個陣列的和等價於arr[1] + arr[2] + arr[3]…等價於arr[1] + arr[1+1] + arr[1+1+1]…
完全ok.而且我們還找到了三要素中的找重複。
第二步:找變化,把變化的量作為遞迴的引數。那麼問題中的那個量再不斷的不斷的變化呢?顯而易見 ,是陣列的下標在不斷的+1。ps:當你的遞迴沒法寫下去的時候,很可能就是缺少了引數。
第三步:找出口。如果沒有出口,下標就會一直加下去,然後陣列下標溢位,甚至會造成死迴圈。那結束的條件是啥?當我們加到arr.length - 1的時候就該結束index++了,對吧,而且還要返回arr[arr.length-1]的值。
ok,思路有了,上手**。
public static int add(int arr, int index)
// 問題的分解,第一步+第n步的值就是陣列的和。
return arr[index] + add(arr, index+1);
}
是不是非常的簡潔,是不是瞬間感受到了遞迴的魅力。
我們來分步看一下**。
1、先找出結果
return arr[index] + add(arr, index+1);
這個也符合找重複中的:第一步我們自己處理,剩下的交給遞迴。
2、然後再找出口
if (index == arr.length-1)
其實這個求和裡面還存在乙個隱藏得變化量。你猜猜是啥,巧妙之處在哪。我就不揭露謎底了。當你發現並理解之後,你會更加愛上遞迴的。
1、切蛋糕的經典案例:二分查詢法
為了可以更加清晰的理解二分的遞迴寫法,看一下使用迴圈寫的**
中英**理解、實現二分查詢(迴圈)
下面是迴圈的**(不清楚二分思想的,戳上面鏈結)
public static int binarysearch(int arr, int target) else if (target < midvalue) else
} return -1; // while結束仍然沒有找到,則返回-1
}
接下來是迴圈轉換遞迴的**,大家可以對照一下
static int index = -1;
public static int binarysearch(int arr, int target, int left, int right)
int midindex = left + ((right - left) >> 1);
int midvalue = arr[midindex];
if (target < midvalue)
else if (target > midvalue)
else
return index;
}
簡單介紹一下斐波那契數列。
例如:1、1、2、3、5、8、13…就是斐波那契數列,第n項的和等於前兩項的和
題目:當n=10的時候,是多少?
思路:使用遞推公式:f(n) = f(n-1) + f(n-2)
**
// 遞迴例題:斐波那契數列
public class demo14
// 找出遞推公式,找到出口
public static int fib(int n)
return fib(n-1) + fib(n-2);
}}
不過多解釋,還是那句話,接下來,最重要的一步,開啟你的**編輯器,敲一遍。其中的奧妙,細品,你細品。
遞迴的學習之路,任重而道遠,學得越多,會的越少。希望你我都能堅持下去。
程式設計是手上功夫,不要做乙個走馬觀花的人,不要做乙個看起來很厲害的人
這是送給現在的我的。
ps:由於本人水平有限,**、文章難免會有一些錯漏之處,還希望大佬們不吝賜教。謝謝!!!
Python入門一頭霧水
小練習之刪掉陣列中的重複項 如下 numbers 9 4,0 0,2 9,8 8,8 8 uniques for number in numbers if number not in uniques print uniques 2 元組 元組表示方式 numbers 1,2,3 陣列表示方式 num...
大頭程式設計師成長史 老薑說得我一頭霧水
老薑的工作室在乙個小巷子裡,距離我的住處有一條街。人和人就是不能比,想起那個裝修公司的小老闆,感覺老薑真的熱情爽快,我非常激動。那個。老薑,哦,不,姜總。我叫李童,因為我生下來頭就大,所以大家都叫我大頭,您就叫我大頭吧。大頭?哈哈,嗯,別說,你的頭還真的是人家的大些。頭大聰明嘛!哦,對了,我就是乙個...
裡用gam使用 第一次使用Roam一頭霧水?
有感於自己使用chrome外掛程式,自己看了官方文件也是一頭霧水的狀態,想到自己使用的roam research,用了好幾個月也是不斷摸索的,記錄下使用roam research方法供新手們參考。工具的使用是簡單的,但是看著詳盡的工具文件和使用者們優秀的用例會感覺很複雜,而且roam researc...