簡體   English   中英

遞歸中的全局變量。 Python

[英]Global variables in recursion. Python

好的,我使用的是 Python 2.7.3,這是我的代碼:

def lenRecur(s): 

    count = 0

    def isChar(c):
        c = c.lower()
        ans=''
        for s in c:
            if s in 'abcdefghijklmnopqrstuvwxyz':
                ans += s
        return ans

    def leng(s):
        global count
        if len(s)==0:
            return count
        else:
            count += 1
            return leng(s[1:])

    return leng(isChar(s))

我正在嘗試修改leng函數內的變量count 以下是我嘗試過的事情:

  1. 如果我將變量 count 放在lenRecur函數之外,它第一次可以正常工作,但是如果我在不重新啟動 python shell 的情況下再次嘗試,則計數(顯然)不會重新啟動,因此它會不斷添加。
  2. 如果我將count += 1行更改為count = 1它也可以工作,但輸出(顯然)是 1。

所以,我的目標是使用遞歸獲取字符串的長度,但我不知道如何跟蹤字母的數量。 我已經搜索了有關全局變量的信息,但仍然卡住了。 不知道是我還沒看懂,還是我的代碼有問題。

提前致謝!

lenRecur count不是全局的。 它是一個作用域變量。

在以這種方式工作之前,您需要使用 Python 3; 您正在尋找添加到 Python 3 的nonlocal語句

在 Python 2 中,您可以通過使用可變(例如列表)作為count來解決此限制:

def lenRecur(s): 

    count = [0]

    # ...

    def leng(s):
        if len(s)==0:
            return count[0]
        else:
            count[0] += 1
            return lenIter(s[1:])

現在您不再改變count名稱本身; 它保持不變,它一直引用同一個列表。 您所做的只是更改count列表中包含的第一個元素。

另一種“拼寫”是使count成為一個函數屬性:

def lenRecur(s): 

    # ...

    def leng(s):
        if len(s)==0:
            return leng.count
        else:
            leng.count += 1
            return lenIter(s[1:])

    leng.count = 0

現在count不再是lenRecur()本地的; 它已成為不變的lenRecur()函數的一個屬性。

對於你的具體問題,你實際上是想多了。 只需讓遞歸進行求和:

def lenRecur(s):
    def characters_only(s):
        return ''.join([c for c in s if c.isalpha()])

    def len_recursive(s):
        if not s:
            return 0
        return 1 + len_recursive(s[1:])

    return len_recursive(characters_only(s))

演示:

>>> def lenRecur(s):
...     def characters_only(s):
...         return ''.join([c for c in s if c.isalpha()])
...     def len_recursive(s):
...         if not s:
...             return 0
...         return 1 + len_recursive(s[1:])
...     return len_recursive(characters_only(s))
... 
>>> lenRecur('The Quick Brown Fox')
16

我認為你可以通過 count 作為第二個參數

def anything(s):
    def leng(s, count):
        if not s:
            return count
        return leng(s[1:], count + 1)

    return leng(isChar(s), 0)

這應該比從外部范圍靜音對象更好,例如使用可變對象( listdict )或猴子修補函數本身。

您需要使變量計數成為函數變量,例如

def lenRecur(s):
    lenRecur.count = 0

但是,我發現代碼存在一些問題。

1)如果您試圖通過遞歸查找字符串中的字母數,則可以這樣做:

def lenRecur(s):
    def leng(s, count = 0):
            if not s:
                    return count
            else:
                    count += int(s[0].isalpha())
                    return leng(s[1:], count)
    return leng(s)

但我仍然希望有一個單一的功能來完成任務,就像根本沒有 leng 方法一樣。

2)如果您的目標只是找到字符串中的字母數,我更喜歡列表理解

def alphalen(s):
    return sum([1 for ch in s if ch.isalpha()])

如果這不是學習目的,我建議你避免遞歸。 因為,該解決方案不能用於更大的字符串(比方說,從文件的內容中查找字母數)。 您可能會遇到超過最大遞歸深度的 RunTimeError。

盡管您可以通過 setrecursionlimit 函數設置遞歸深度來解決此問題,但我建議您采用其他簡單的方法。 有關在此處設置遞歸限制的更多信息。

如果要將其用作全局變量,請在所有函數定義之外定義它:

count = 0
def lenRecur(s): 

或將其定義為函數屬性:

def lenRecur(s): 
    lenRecur.count = 0
    def isChar(c):

這已被固定在py3.x在那里你可以使用nonlocal語句:

def leng(s):
    nonlocal count
    if len(s)==0:

你不需要數。 下面的功能應該可以工作。


    def leng(s):
        if not s:
            return 0
        return 1 + leng(s[1:])

遞歸中的全局變量非常棘手,因為深度達到其最后一個狀態並開始返回到第一次遞歸調用局部變量的值發生變化,因此我們使用全局變量。 全局變量的問題在於,當您多次運行 func 時,全局變量不會重置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM