簡體   English   中英

python 遞歸 function 中沒有 output

[英]Nothing is output in python recursive function

  • 項目清單

我正在編寫一個代碼來計算翻轉立方體的兩個配置之間的“距離”,兩個配置 x 和 y 之間的距離是 go 從 x 到 y 所需的最小步數,或者相反。

為了做到這一點,我創建了一個更簡單的版本,使一些不同,這段代碼需要兩個 integer 數字cicf with ci通過名為multi的生成器返回一個名為main_level的可迭代對象,然后,它遍歷它以搜索參數cf ,只要cf不在main_level中,變量steps就會增加 1 並且對於main_level中的每個元素,我們重復相同的過程為ci 最后,當cii==cf程序結束並返回steps變量,它計算我們必須向下 go 找到給定參數cf的“級別”數。 這段代碼沒有任何實際用途,只是我上面提到的問題的基礎。

如果我用 ci=5 調用距離(ci,cf) function,前兩個級別是:

{0,3,6,9,12} <-- 第一級(steps 初始化為 1)如果cf是集合中的任何數字,則程序應該結束並返回 steps= 1 ,如果cf不在其中設置,程序形成第二級: {15,18,21,24,27,30,33}並搜索cf ,如果cf在那里,程序結束並應該返回 steps= 2 ,如果沒有,它 forms 第三水平等等。 但是有一個問題,實際上,當我用ci =5 和cf = 任何自然數調用距離 function 並打印它的值時,任何東西都是 output,僅對於cf =0,它輸出 step= 1 我真的不知道發生了什么事。 我會很感激你的幫助。

這是代碼:

#Base solution to FlipCube problem

def multi(par):
   for i in range(par):
     yield i*3    

steps=1 

def distance(ci,cf):
    main_level =set(multi(ci))
    global steps  

    def check_main_level(cf):
        global  steps 
        nonlocal  main_level
        
        def lower_level(config_list):
            sett=set()
            for i in config_list:
               sett.update(q for q in multi(i) if q not in config_list)
            nonlocal  main_level
            main_level=sett
            check_main_level(cf)  

        for i in main_level:
            if i==cf:
                break
            else:
                steps+=1
                lower_level(main_level)
    check_main_level(cf)              
    return steps  
    
#testing
e=  distance(5,0)
print(e)# prints 1, very good
e2=  distance(5,9)
print(e2)# should print  1, but doesn't print anything :(
e3=  distance(5,27)
print(e3)# should print  2, but doesn't print anything :(

程序不會在所有情況下終止遞歸。 罪魁禍首似乎是check_main_level中的for循環。 lower_level定義后的代碼更改為:

# code portion of check_main_level
        if cf > max(main_level):
            steps+=1
            lower_level(main_level)
# end of code portion check_main_level (replacing for-loop)

你有一個無限循環,這就是為什么沒有打印任何內容。

您可以通過添加打印輕松地看到它:

for i in config_list:
               print(i)
               sett=set()
               sett.update(q for q in list(multi(i)) if q not in config_list)

暫無
暫無

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

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