簡體   English   中英

為什么這個迭代程序會超出遞歸限制?

[英]Why does this iterative program exceed recursion limit?

我正在嘗試解決一個項目歐拉問題(編號 52),該問題要求最小的 integer,n,使得 n、2n、3n、4n、5n、6n 都具有相同的十進制數字排列。 我想我會從一個蠻力程序開始(作為我自己的編程練習),它尋找一個 integer n 使得 n 和 2n 具有相同的數字(項目歐拉問題提到 125874 就是這樣一個 integer,所以我想蠻力程序會起作用)。 所以我編寫了一個 python 程序,它按順序查看每個 integer,創建其數字的排序列表,並將該列表與 2n 的排序數字列表進行比較。 我的程序似乎是迭代的,所以我不確定為什么它會在幾分之一秒后停止運行並發回“比較中超出的最大遞歸深度”。 我決定在下面的 function "k" 中綁定無界搜索,看看它走了多遠,它似乎沒有超過 n= 100,000。 鑒於每次調用 k 時,它只需要對兩個大小不超過 6 的列表進行排序和比較,我想知道為什么它會給我這個錯誤? 我用谷歌搜索了這個錯誤,有人建議增加遞歸限制,所以我添加了你看到的“sys.setrecursionlimit(2000)”。

這是我的代碼:

function f 采用 integer 並返回其數字列表。 g 對它們進行排序。 h 比較 n 和 2n 的列表。 和 k 迭代。

import math
import sys

sys.setrecursionlimit(2000)

def f(n, l):
    if (math.floor(n / 10) == 0):
        l.append(n)
        return l

    else:
        l.append(n % 10)
        return f(int((n - (n % 10)) / 10), l)

def g(n):
    return sorted(f(n, []))

def h(n):
    if ((g(n) == g(2 * n))):
        return 1
    else:
        return 0

def k(n):
    if ((h(n) == 1)):
        return n
    elif ((n <= 100000)):
        return k(n + 1)
    else:
        return "checked up to bound"

print(k(1))

重點介紹這部分:

def k(n):
    if ((h(n) == 1)):
        return n
    elif ((n <= 100000)):
        return k(n + 1)

125874h(n) == 1的最小數,因此遞歸調用k(1), k(2), k(3), ... k(125874) sys.setrecursionlimit(2000) Go 通過n的不同值迭代,即用一個循環。

暫無
暫無

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

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