日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

递归该怎么写(二)

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归该怎么写(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于簡單的遞歸(可以寫出數學表達式的遞歸),我們已經熟練掌握,但是對于有些遞歸我們有時候無從下手。這時候我們需要將抽象的問題數學化,或者能表達出來。

?(本節需要掌握: 熟悉遞歸函數的返回是一個什么???

例1:字符串的全排列問題(劍指offer)

輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。

首先我們考慮該問題是否是可以用相同方法解決? 對于abcd例子

① a b c d 的排列我們首先用表達式表達??Perm(a b c d)? 這個表示對 abcd全排列

② 然后發現把abcd 全排列就可以轉化為? ? ?把 a打頭 對 bcd 全排列Perm(b c d)? ? ?b打頭 對 acd 全排列Perm(a c d)? ? ?

c打頭 對 abd 全排列Perm(a b d)? ? ??d打頭 對 abc 全排列Perm(a b c)

這個就不是很簡單的遞歸了,這需要我們加入一些條件(循環),來讓它執行遞歸過程。? 其實第二個過程就是一個循環的過程

1 def prem(abcd):
2     for i in abcd:
3       i + prem(沒有i的字符串)    我們可以保留的結果

這里我們假設 prem返回的就是 一些字符的排列組合的結果。
比如a + prem(cd) 就相當于 a + [cd, dc] ----> acd adc

注意? ?:? ? (這個理解了就很簡單了

④ 這時候我們還有十分重要的一步(遞歸出口在哪呢???)? ? 我們將問題一步步分解,發現 例如? abc排好了? 剩下d 一個了,那就不需要執行prem了。

出口就是: 當為一個字符時結束

 1 def Permutation(ss):
 2         # write code here
 3         result = []
 4         if not ss:
 5             return []
 6         if len(ss) ==1:   #出口
 7             return [ss]
 8         for i in range(len(ss)):          #分別固定每一個開頭
 9             temp = Permutation(ss[:i] + ss[i+1:])        #排列剩下的, 假設返回一個列表結果
10             for j in temp:
11                 result.append(ss[i] + j)     #保存結果,這部分很難理解  只需要理解第三步就很好理解了
12         return list(set(result))

?

例2:

?

轉載于:https://www.cnblogs.com/WSX1994/p/10830963.html

總結

以上是生活随笔為你收集整理的递归该怎么写(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。