遞迴入門,送給一頭霧水的你

2021-10-03 03:28:48 字數 2628 閱讀 2121

學的東西越多,反而覺得自己會的越少了。初次了解遞迴之後才發現,這是什麼神仙操作???然後樂此不疲,學不會,我就把你背會,敲會,一回生二回熟,慢慢也就理解了。

接下來放幾個小案例,送給傻乎乎努力的自己和正在努力的你。

希望對你有所幫助吧。

遞迴我聽過的最簡單但是也是最沒用的描述是:乙個方法自身呼叫自身。

但總歸對遞迴有了非常模糊的認識。

所有的迴圈基本都可以使用遞迴來實現。

遞迴的基礎思維是:

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...