Python 创建一个返回所有P位数字的回溯程序,使每3个连续数字的总和达到S
作为一个问题,我们的任务是编写一个递归回溯程序,该程序打印所有带有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
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位重复。这是一个巨大的优化。
这不是你问的同一个问题吗?对,我的错。我最初的代码打算搜索至少一个三元组。