Python八皇后問題的學習體會與分析-遞迴的運用
這是教材上的程式碼:
def conflict(state, nextX): nextY = len(state) for i in range(nextY): if abs(state[i]-nextX) in (0, nextY-i): return True return False def queens(num, state=()): #print num,state for pos in range(num): if not conflict(state, pos): if len(state) == num-1: yield (pos,) else: for result in queens(num, state+(pos,)): #生成八或N個的元組 yield (pos, ) + result
分析一:
1.此種方法看上去較酷,感到很高大上的程式設計。佔用記憶體小,運用了生成器。
2.教材上講了如果不能安排好下一下皇后,則進行上一個皇后的位置改變,再迭代。但我感覺是究舉之後的依次判斷,即列出所有可能的位置組合,再進行一一判斷。
3.可以先理解,用遞迴實理的N層迭代。如下程式碼
def my_func(num, state=()): for i in range(9): print i, if len(state) == num-1: yield (len(state),) #print "len state",len(state) else: for result in my_func(num, state+(0,)): yield (len(state),)+result print "resault....",result a=list(my_func(8))
兩個yield很關鍵,第一個是結束遞迴的條件,第一個,生成N個的元組,練習時可以改i,為POS,就像八皇后了。def test(num,state=()): print "start.", for i in range(num): print i, if len(state)==num-1: yield (100,) else: for result in test(num,state+(0,)): print "in." print "recur...len result is: ",len(result),result yield (50,)+result a=list(test(4)) print len(a) print a
5.理解了4.對於八皇后,就更易理解了。加了對衝突的判斷,即便是要找的解了。
相關推薦
Python八皇后問題的學習體會與分析-遞迴的運用
這是教材上的程式碼:def conflict(state, nextX): nextY = len(state) for i in range(nextY): if abs(state[i]-nextX) in (0, nextY-i):
計算機演算法設計與分析——遞迴與分治策略(一)
遞迴: 直接或者間接地呼叫自身的演算法稱為遞迴。用函式自身給出定義的函式成為遞迴函式。 使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。有些資料結構,如二叉樹等,由於其本身固有的遞迴特性,特別適合用遞迴的形式來描述。另外,還有一些問題,雖然其本身沒
Java實現八皇后問題,用陣列遞迴演算法,簡單易懂
八皇后問題 要將八個皇后放在棋盤上,任何兩個皇后都不能互相攻擊。即沒有兩個皇后是在同一行、同一列或者同一對角上。 典型的八皇后問題,使用Java寫的演算法,演算法雖比較簡單,但難免會有新手會犯疏漏和錯誤,希望大家可以批評指正,共同交流進步! 程式碼
帶你輕而易舉的學習python——八皇后問題
首先我們來看一下這個著名的八皇后問題 八皇后問題:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 在這個問題提出之後人們又將它擴充套件到了n×n格的棋盤擺放n個皇后有多少種擺法 其實這是隻有在8×8出現這種問題嗎?那
python學習日記(初識遞迴與演算法)
遞迴函式 定義 遞迴的定義——在一個函式裡再呼叫這個函式本身 遞迴的最大深度——997,即棧溢位。 使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不
演算法分析 遞迴與分治
1. Fibonacci數列 無窮數列1,1,2,3,5,8,13,21,34,55,……,稱為Fibonacci數列。它可以遞迴地定義為: 第n個Fibonacci數可遞迴地計算如下: int fibonacci(int n)  
Python實現機器學習之迴歸分析
前言 機器學習常用來解決相關分析和迴歸分析的問題,有時候大家會混淆兩者之間的差異,這裡通過對比分析來說明兩者的區別和聯絡,最後會以呼叫sklearn包中LinearRegression方法進行簡單線性迴歸分析為例,說明如何使用python進行資料分析。 一、相關分析和迴
《零基礎入門學習Python》(22)--函式:遞迴是神馬
前言 普通程式設計師用迭代,天才程式設計師用遞迴 知識點 遞迴是神馬? 遞迴是屬於演算法的範疇。 遞迴就是函式呼叫自身的一種行為。 >>> def g(): return g() >>> g()
python 學習彙總36:遞迴函式(尾遞迴)( tcy)
遞迴函式(尾遞迴) 2018/11/15 用途: 遞迴函式常用於檢索大量資料,替代for迴圈。 1.遞迴深度設定: sys.getrecursionlimit() #返回
python學習日記(二)"遞迴函式,列表"
遞迴函式 遞迴函式簡而言之就是自己呼叫自己,一開始的時候覺得很難理解,後來給別人講解的時候就突然想到了學微控制器的時候學的中斷,就突然都理解了 定義:函式直接或間接呼叫自身 優點:簡潔,理解容易 缺點:對遞迴深度有限制,消耗資源大 注意:一定要注意結束條件 x=0 def
python中的記憶體管理與分析以及垃圾回收機制
1.記憶體分析和處理 程式的執行離不開對記憶體的操作,一個軟體要執行,需要將資料載入到記憶體中,通過CPU進行記憶體資料的讀寫,完成資料的運算。 1.1不可變資料型別VS可變資料型別 python中根據資料是否可以進行修改提供了兩種不同的資料型別 ⚫ 不可變資料
python快速排序遞迴與非遞迴
寫在前面 眾所周知,快速排序相對於選擇排序,插入排序,氣泡排序等初級排序有著天然的優勢。這是因為快排在交換元素的過程中,兩個發生交換的元素,距離較遠。比如插入排序,新的元素要在已經有序的序列中,一次又一次地找到它應該處於的位置,交換的次數遠遠高於快排。但是,使
python實現 二叉樹的前序中序後序遍歷層次遍歷——遞迴與非遞迴
前序遍歷 # ------ coding:utf-8 ------- class TreeNode: def __init__(self, x): self.val = x
python學習筆記16(遞迴、棧和佇列)
遞迴、棧和佇列 遞迴呼叫: 一個函式,呼叫了自身,稱為遞迴呼叫 遞迴函式: 一個會呼叫自身的函式稱為遞迴函式 特點: 凡是迴圈能幹的事,遞迴都能幹 過程: 1、寫出臨界條件 2、找這一次和上一次的關係 3、假設當前函式已經能用,呼叫自身計算上一次的結果,再求出本次的結果 #輸入一
N皇后問題(遞迴與非遞迴解法)
最近演算法老師講到了N皇后問題,我順便在這邊總結一下他的思路,主要還是深搜加剪枝.解題思路:用陣列c儲存每個皇后在下標行中的位置(即列),然後進行深搜加剪枝判斷,如果不符合條件了,則回朔.思路很簡單,下
八皇后問題各種解法分析
遞迴與回溯: a.回溯演算法的基本思想:從問題的某一種狀態出發,搜尋可以到達的所有狀態。當某個狀態到達後,可向前回退,並繼續搜尋其他可達狀態。當所有狀態都到達後,回溯演算法結束! b.對於回溯演算法,在前面KMP匹配中就利用了這個思想,只不過當時KMP中
資料結構學習筆記(二)---求階乘(遞迴與非遞迴)
求100!的階乘 遞迴演算法: #include <stdio.h> long f(long n) { if(1 == n) return 1; else return f(
Fibonacci(斐波那契)數列的遞迴與非遞迴實現 python
Fibonacci數列為:0、1、1、2、3、5、8、13、21...... 數列第一項為0,第二項為1,從第三項開始,每一項為相鄰前兩項之和。 用遞迴的方法來定義: F(0) = 0 F(1) = 1F(n) = F(n-1) + F(n-2) , n>=2用
18-Oracle學習_儲存過程-遞迴-樹狀結構的儲存與展示
一, 表 create table article ( id number primary key, cont varchar2(4000), pid number, isleaf number(1), -- 0, 葉子結點; 1, 非葉
5.4.2 序列化解釋與尾遞迴
5.4.2 序列化解釋與尾遞迴 顯式控制的直譯器在ev-sequence的部分與元迴圈的直譯器的eval-sequence 程式是很相似的。它處理在程式體中的表示式的序列或者是顯式的begin表示式。 通過把要解釋的表示式的序列放入unev,在棧上儲存continue,跳轉到ev-sequenc