簡體   English   中英

python:遞歸函數計數器。 持久性問題

[英]python: recursive function counter. persistence issue

也許你們中的一些人已經嘗試解決代碼戰上的“持久性錯誤”任務。 所以輪到我了:)

def persistence(num):
  multi = 1
  while num:
    multi *= num % 10
    num /= 10
  global count
  count += 1
  if(multi >= 10):
    persistence(multi)
  else:
    return 0
  return count
count = 0
print(persistence(39))
#print(persistence(25))

它給了我正確的迭代結果和 1 次嘗試的成功結果。 (persistence(39) => 3 # Because 3*9 = 27, 2*7 = 14, 1*4=4)但是因為使用了全局變量我不能運行它超過 1 次。 如何處理? 如何創建計數器並在此時遞歸使用此函數?

你的嘗試很好,但方法很幼稚,而且有一點缺陷。 使用global在函數的遞歸調用中保持計數存在對后續新的不相關調用使用相同計數變量的問題; 這就是為什么你目前有這個問題。

您可以改為通過將返回值增加 1 並在最后一次調用中返回0來計算函數執行遞歸的次數。 最終計數是所有遞歸調用后的累計計數。

這是使用operator.mulfunctools.reduce的一種方法:

from functools import reduce
import operator

def persistence(num):
    if len(str(num)) == 1:
        return 0
    val = reduce(operator.mul, map(int, str(num)))
    return 1 + persistence(val)

print(persistence(39))
# 3
print(persistence(25))
# 2

在遞歸中,如果你需要管理狀態,你可以在函數的參數中管理它:

def persistence(num):
  #here is your code, slightly modified.
  def _persist(num,count=0):
    multi = 1
    while num:
      multi *= num % 10
      num /= 10
    if(multi >= 10):
      return _persist(multi,count+1)
    else:
      return count
  return _persist(num)

在那里您有效地為您的函數呈現一個接口,但您實際上是通過_perist遞歸調用它。

您可以使用 while 循環輕松完成!

def persistence(n):
    loop_count = 0
    while len(str(n)) != 1:
        i = 1
        for number in str(n):
            i = int(number) * i
        n = i
        loop_count += 1
    return loop_count

暫無
暫無

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

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