1. 程式人生 > >python使用遞迴思想處理問題

python使用遞迴思想處理問題

今天我們主要學習使用遞迴思想處理,斐波那契數列,列印檔案層級結構

,漢諾塔小遊戲。

遞迴說的稍微簡點就是函式呼叫自身的一種方法,哪有人說,自己呼叫自己那不就死迴圈的了嗎,那就需要我們自己設定結束條件,我個人認為遞迴思想你只要把開頭和結束條件理清了思路,中間的那大部分就是一遍又一遍的呼叫自身。
先來看一下斐波納挈數列,我們先是用迴圈在使用遞迴思想來列印:
def fab(n):
    a = 0
    b = 1
    while n > 0:

        if a == 0 or b == 1:
            print(1,end= ' ')
            a, b = b, a + b
            n -= 1
else: print(b, end= ' ') a, b = b, a + b n -= 1 我們列印一下5以內的斐波納挈數列: fab(10) G:\python\python.exe G:/Pyproject/day115/test3.py 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 Process finished with exit code 0

我們在使用遞迴思想列印斐波納挈數列:

def
fab(n):
if n == 2 or n == 1: return 1 else: return fab(n - 1) + fab(n - 2) for i in range(1, 21): print(fab(i), end= ' ') 我們列印二十以內的斐波納挈數列 G:\python\python.exe G:/Pyproject/day115/test3.py 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 Process finished with
exit code 0

接下來我們使用遞迴思想來實現列印 檔案目錄結構層級的列印,我們還是先用迴圈來解決問題:

import os
def get_all(path):

    temp = [path]
    while len(temp):
        new_path = temp.pop()
        L = os.listdir(new_path)
        for name in L:
            new_name = os.path.join(new_path, name)
            if os.path.isdir(new_name):
                print('目錄:', new_name)
                temp.append(new_name)
            else:
                print('檔案:', new_name)


get_all(r'G:\blogworkspace\blogproject\comments')

來看實現結果:
G:\python\python.exe G:/Pyproject/day115/test2.py
檔案: G:\blogworkspace\blogproject\comments\admin.py
檔案: G:\blogworkspace\blogproject\comments\apps.py
檔案: G:\blogworkspace\blogproject\comments\forms.py
目錄: G:\blogworkspace\blogproject\comments\migrations
檔案: G:\blogworkspace\blogproject\comments\models.py
檔案: G:\blogworkspace\blogproject\comments\tests.py
檔案: G:\blogworkspace\blogproject\comments\urls.py
檔案: G:\blogworkspace\blogproject\comments\views.py
檔案: G:\blogworkspace\blogproject\comments\__init__.py
目錄: G:\blogworkspace\blogproject\comments\__pycache__
檔案: G:\blogworkspace\blogproject\comments\__pycache__\admin.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\forms.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\models.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\urls.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\views.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\__init__.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\migrations\0001_initial.py
檔案: G:\blogworkspace\blogproject\comments\migrations\__init__.py
目錄: G:\blogworkspace\blogproject\comments\migrations\__pycache__
檔案: G:\blogworkspace\blogproject\comments\migrations\__pycache__\0001_initial.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\migrations\__pycache__\__init__.cpython-36.pyc

Process finished with exit code 0

接著我們使用遞迴來實現:

import os


def get_all(path):
    L = os.listdir(path)

    for name in L:
        new_path = os.path.join(path, name)
        if os.path.isdir(new_path):
            print('目錄:', new_path)
            get_all(new_path)
        else:
            print('檔案:', new_path)


get_all(r'G:\blogworkspace\blogproject\comments')

列印結果是:
G:\python\python.exe G:/Pyproject/day115/test2.py
檔案: G:\blogworkspace\blogproject\comments\admin.py
檔案: G:\blogworkspace\blogproject\comments\apps.py
檔案: G:\blogworkspace\blogproject\comments\forms.py
目錄: G:\blogworkspace\blogproject\comments\migrations
檔案: G:\blogworkspace\blogproject\comments\migrations\0001_initial.py
檔案: G:\blogworkspace\blogproject\comments\migrations\__init__.py
目錄: G:\blogworkspace\blogproject\comments\migrations\__pycache__
檔案: G:\blogworkspace\blogproject\comments\migrations\__pycache__\0001_initial.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\migrations\__pycache__\__init__.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\models.py
檔案: G:\blogworkspace\blogproject\comments\tests.py
檔案: G:\blogworkspace\blogproject\comments\urls.py
檔案: G:\blogworkspace\blogproject\comments\views.py
檔案: G:\blogworkspace\blogproject\comments\__init__.py
目錄: G:\blogworkspace\blogproject\comments\__pycache__
檔案: G:\blogworkspace\blogproject\comments\__pycache__\admin.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\forms.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\models.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\urls.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\views.cpython-36.pyc
檔案: G:\blogworkspace\blogproject\comments\__pycache__\__init__.cpython-36.pyc

Process finished with exit code 0

最後我們來看一下漢諾塔遊戲:

def hanoi(n, x, y, z):
    if n == 1:
        print(x, ' --> ', z)
    else:
        hanoi(n-1, x, z, y) # 將前n-1個盤子從x移動到y上
        print(x, ' --> ', z) # 將最底下的最後一個盤子從x移動到z上
        hanoi(n-1, y, x, z) # 將y上的n-1個盤子移動到z上

n = int(input('請輸入漢諾塔的層數:'))
hanoi(n, 'X', 'Y', 'Z')

有x y z三個柱子,箭頭指向表示從哪轉移哪
我們輸入三,看一下執行結果:
請輸入漢諾塔的層數:3
X  -->  Z
X  -->  Y
Z  -->  Y
X  -->  Z
Y  -->  X
Y  -->  Z
X  -->  Z

Process finished with exit code 0

相關推薦

python使用思想處理問題

今天我們主要學習使用遞迴思想處理,斐波那契數列,列印檔案層級結構 ,漢諾塔小遊戲。 遞迴說的稍微簡點就是函式呼叫自身的一種方法,哪有人說,自己呼叫自己那不就死迴圈的了嗎,那就需要我們自己設定結束條件,我個人認為遞迴思想你只要把開頭和結束條件理清了思路,中間

整數劃分問題(python)-- and 動態規劃(m個盤裡放n個蘋果思想類似)

這篇部落格旨在對正整數劃分的多種題目就遞迴和動態規劃進行討論與總結 以下將正整數劃分分為三種題型:1.一般性,即對個數以及大小以及重複性不加約束 2.對重複性有約束 3.對元素的個數有約束。至於每個元

Python處理目錄下的檔案

本文首發於我的個人部落格:Suixin’s Blog 原文: https://suixinblog.cn/2019/01/os-walk.html  作者: Suixin 使用os模組的os.walk()函式可以遞迴地遍歷目錄。 用法 os.walk(top, to

Python與迭代

1、遞迴與迭代: 遞迴和迭代都是迴圈的一種。簡單地說,遞迴是重複呼叫函式自身實現迴圈。迭代是函式內某段程式碼實現迴圈,而迭代與普通迴圈的區別是:迴圈程式碼中參與運算的變數同時是儲存結果的變數,當前儲存的結果作為下一次迴圈計算的初始值。 遞迴迴圈中,遇到滿足終止條件的情況時逐層返回來結束。迭代則使用計數器結

python 方法 斐波那契數列—漢諾塔

#普通方法生成 def feibo(n): a,b=0,1 print('0,1',end='') for i in range(n-1): a,b=b,a+b print(',{0}'.format(b),end='') #遞迴方法生成 def

Python二分法

# lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] # 時間複雜度. n# # 讓使用者輸入一個數n. 判斷這個n是否出現在lst中# n = int(input("請輸入一個數字n:")) # 56# for el in lst:# if

思想和例項

先給一個簡單的階乘例子: public static int getDg(int x){ System.out.println(x); if (x==1) { return 1; } if (x<4) { return x * getDg(x-1);

【11】python

   一、遞迴原理小案例分析 (1)# 概述 遞迴:即一個函式呼叫了自身,即實現了遞迴 凡是迴圈能做到的事,遞迴一般都能做到!     (2)# 寫遞迴的過程 1、寫出臨界條件 2、找出這一次和上一次關係 3、假設當前函式已經能用,呼叫自身計算

Python演算法

用python寫出一個漢諾塔遞迴函式 def move(n, a, b, c): if(n == 1): print(a,"->",c) return move(n-1, a, c, b) move(1, a, b, c) m

Python呼叫_漢諾塔問題

遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。 使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大

python 深度優先搜尋與廣度優先搜尋演算法模擬實現

一、遞迴原理小案例分析 (1)# 概述 遞迴:即一個函式呼叫了自身,即實現了遞迴 凡是迴圈能做到的事,遞迴一般都能做到! (2)# 寫遞迴的過程 1、寫出臨界條件2、找出這一次和上一次關係3、假設當前函式已經能用,呼叫自身計算上一次的結果,再求出本次的結果 (3)案例分析:求1+2+3+…+n的數和

深入理解思想

1、什麼是遞迴 本質上,將原來的問題轉換為更小的同一問題。問題規模可以不斷縮小,直到達到一個不能再縮小的基本問題,解決這個基本問題,就解決了整個問題。 例如,使用遞迴思想對自然數1、2、3…n-1 、n求和: sum(n) = n +sum(n-1); //sum(n-1)就是被

列印連結串列(學習思想)——牛客

題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 問題分析 注意從尾到頭,這個很符合棧的特性——FILO,考慮用棧。既然想到用棧的形式,可以聯想到遞迴方法,最終確定為遞迴解決本題。 程式碼實現 直接使用當前函式 clas

演算法處理漢諾塔

package com.cn.ygm.hanoiTower; public class HanoiTower { /** * 移動盤子 * topN:移動的盤子數 * from:起始塔座 * inter:中間塔座 * to:目標塔座

Python列出目錄中檔案指令碼及其匿名函式

1.遞迴列出目錄裡的檔案的指令碼舉例 列出目錄中的檔案可以通過下面方法:os.listdir() In [1]: import os In [4]: os.listdir('/root') Out[4]: ['.tcshrc', '.bash_history', '.bashrc',

python解壓資料夾中所有壓縮包

1. 簡述     遞迴解壓資料夾中的所有壓縮包到指定資料夾 2. 環境配置     python解壓rar檔案需要安裝依賴庫 (python-unrar)     Windows: 在 RARLab 官

linux運維-python遍歷目錄+案例應用

一、python中walk()方法遍歷目錄基本使用 1、walk()方法的基本語法 os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) top -- 是你所要遍歷的目錄的地址. topdown -- 可選,為 Tr

Python 函式

遞迴函式 在函式內部,可以呼叫其他函式。如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。 遞迴函式特性: 必須有一個明確的結束條件; 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少 相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸

約瑟夫環思想

轉自:開啟連結 題目描述:30個遊客同乘一條船,因為嚴重超載, 加上風浪大作,危險萬分。因此船長告訴乘客,只有將全船 一半的旅客投入海中,其餘人才能倖免於難。無奈,大家只 得同意這種辦法,並議定30 個人圍成一圈,由第一個人數起,依次報數,數到第9人,便把他投入大海中,然後

python遍歷資料夾裡面的所有檔案

import os path = "F:/new" #資料夾目錄 datas = [] def eachFile(filepath): fileNames = os.listdir(filepath) # 獲取當前路徑下的檔名,返回List for file