1. 程式人生 > >Python八皇后問題的學習體會與分析-遞迴的運用

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))
4.用遞迴實現的N層迭代:
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
兩個yield很關鍵,第一個是結束遞迴的條件,第一個,生成N個的元組,練習時可以改i,為POS,就像八皇后了。
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