使此函数采用任意长度的字符串

Sco*_*nce 1 python python-3.x

此函数采用一串数字和一个目标整数,并打印所有可能的方法来插入运算符以达到所需的目标.在所有情况下,输出必须按顺序包含所有数字; 没有可以省略.

#!/usr/bin/env python3

def find_expressions(digits, target):
    if not (isinstance(digits, str) or isinstance(digits, list)) or not isinstance(target, int):
        raise TypeError
    if len(digits) != 5:
        raise TypeError('digits must be of length 5')
    solutions = []
    operators = ('', ' + ', ' - ', ' * ', ' / ')
    for i in operators:
        for j in operators:
            for k in operators:
                for l in operators:
                    s = digits[0] + i + digits[1] + j + digits[2] + k + digits[3] + l + digits[4]
                    try:
                        if eval(s) == target:
                            solutions.append(s + ' == {}'.format(target))
                    except (ZeroDivisionError, SyntaxError):
                        pass
    print('\n'.join(solutions))
Run Code Online (Sandbox Code Playgroud)

它不漂亮,但它的工作原理.问题是它只需要长度为5的字符串.如何才能使它成为任意长度的字符串?(例如,调用find_expressions('12345678', 2)应该是有效的.)我认为我需要for用递归替换循环,但是我不知道如何实现这一点.

示例输出

调用find_expressions('75228', 5)打印:

7 + 5 + 2 / 2 - 8 == 5
7 * 5 - 22 - 8 == 5
7 * 5 - 2 - 28 == 5
Run Code Online (Sandbox Code Playgroud)

警告

我不满足于通过循环所有可能性而采取的整个蛮力方法.如果总体上有更好的算法,我想听听它.但是,这个问题是关于使该函数采用任意长度输入,同时进行尽可能小的更改.

phi*_*hag 5

用途itertools.product:

import itertools

def find_expressions(digits, target):
    if not (isinstance(digits, str) or isinstance(digits, list)) or not isinstance(target, int):
        raise TypeError

    solutions = []
    operators = ('', ' + ', ' - ', ' * ', ' / ')
    for ops in itertools.product(operators, repeat=len(digits)-1):
        s = digits[0] + ''.join(op + digit for op, digit in zip(ops, digits[1:]))
        try:
            if eval(s) == target:
                solutions.append(s + ' == {}'.format(target))
        except (ZeroDivisionError, SyntaxError):
            pass
    print('\n'.join(solutions))
Run Code Online (Sandbox Code Playgroud)