Python 创建一个返回所有P位数字的回溯程序,使每3个连续数字的总和达到S

Python 创建一个返回所有P位数字的回溯程序,使每3个连续数字的总和达到S,python,loops,recursion,search,backtracking,Python,Loops,Recursion,Search,Backtracking,作为一个问题,我们的任务是编写一个递归回溯程序,该程序打印所有带有p位的数字,使该数字的每3个连续数字加起来等于S 我还不能制定一个递归回溯方法,但我能够用简单的循环和完整的搜索来制定一个 def count(P, S): if P >= 3: for number in range(10**(P-1), (10**P)): string = str(number) # I converted it to string to eas

作为一个问题,我们的任务是编写一个递归回溯程序,该程序打印所有带有p位的数字,使该数字的每3个连续数字加起来等于S

我还不能制定一个递归回溯方法,但我能够用简单的循环和完整的搜索来制定一个

def count(P, S):
    if P >= 3:
        for number in range(10**(P-1), (10**P)):
            string = str(number)      # I converted it to string to easily access every digit of the number.
            isEqual = True
            for digit in range(0, len(str(i))-2):
                if int(string[digit]) + int(string[digit + 1]) + int(string[digit + 2]) != S:
                    isEqual = False
                    break
            if isEqual: print(i)

它是如何递归完成的?

这是一个简单且未优化的版本:

max_digits = 5
tot_sum = 12

max_digit = 9
min_digit = 0
    
digits = {x for x in range(min_digit, max_digit + 1)}

def print_valid_number(cur_digit_i, max_digits, tot_sum, last_2sum, digits, cur_num):
    if cur_digit_i == max_digits:
        print(''.join(map(str, cur_num)))
        return
    
    cur_digits = set(digits)
    if cur_digit_i == 0 and 0 in cur_digits:
        cur_digits.remove(0)
        
    for d in cur_digits:
        if last_2sum + d == tot_sum or cur_digit_i == 0 or cur_digit_i == 1:
            cur_num.append(d)
            next_last_2sum = d + (0 if cur_digit_i == 0 else cur_num[cur_digit_i - 1])
            print_valid_number(cur_digit_i + 1, max_digits, tot_sum, next_last_2sum, digits, cur_num)
            cur_num.pop()
    
print_valid_number(0, max_digits, tot_sum, 0, digits, [])
基本上,在每个递归步骤上传递最后两个数字Last2sum的和,对于每个数字,检查Last2sum+current_digit==S。唯一的例外是前两个索引,在其中循环所有9/10位

代码应该不难理解,但从简要描述中可以清楚地看出,您有许多可行的优化。这里有几个:

您可以限制可能的数字范围。例如,如果S==20,在最后的数字中,你肯定找不到数字1。相反,如果S==8,最高数字将是8。 您可以通过优化前两个索引来减少递归的数量,因为它几乎不起眼 如果运行此代码,您会发现从第4位开始,前3位重复。这是一个巨大的优化。
这不是你问的同一个问题吗?对,我的错。我最初的代码打算搜索至少一个三元组。