我试图写一个函数,它打印出从起始数到目标数的最小步数,用2乘以2,再减go 1.

然而,我得到了一个错误:

RecursionError: maximum recursion depth exceeded in comparison

以下是我编写的代码:

def no_steps(start,target,sofar):
    if start == target:
        return sofar
    elif start < target and start > 0:
        no_steps(start*2,target,sofar+'*2 ')
        no_steps(start-1,target,sofar+'-1 ')
print(no_steps(2,6,''))

我可以知道我做错了什么吗?代码有问题吗?

推荐答案

我的解释是:从2(start)开始,2的乘法和1的减法序列将导致6(target),这样的运算量最少,这意味着并不总是按照这个顺序.

一方面,由于缺少正确的返回语句的实现,您有一个递归问题(这是您在输出中看到的).另一方面,也缺少一些逻辑来实现最少的计算步骤.我的组合解决方案(递归和最小步数)是:

def no_steps(start, target, sofar):
    if start == target:
        return sofar
    if 0 < start and 0 < target:
        if (target % 2 == 0) and target > start:
            return no_steps(start, target // 2, '*2 ' + sofar)
        else:
            return no_steps(start, target + 1, '-1 ' + sofar)
    return sofar

no_steps(1, 6, '')
'*2 *2 -1 *2 '

no_steps(2, 6, '')
'*2 -1 *2 '

no_steps(3, 6, '')
'*2 '

no_steps(4, 6, '')
'-1 *2 '

no_steps(5, 6, '')
'-1 -1 *2 '

no_steps(6, 6, '')
''

no_steps(7, 6, '')
'-1 '

no_steps(2, 17, '')
'*2 -1 *2 -1 *2 -1 *2 -1 '

EDIT:根据帕布罗鲁伊斯的答案修复了之前有缺陷的逻辑.

Python相关问答推荐

如何对行使用分段/部分.diff()或.pct_change()?

每个组每第n行就有Pandas

有没有方法可以修复删除了换码字符的无效的SON记录?

inspect_asm不给出输出

Odoo -无法比较使用@api.depends设置计算字段的日期

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

我从带有langchain的mongoDB中的vector serch获得一个空数组

Python中的嵌套Ruby哈希

查找两极rame中组之间的所有差异

用合并列替换现有列并重命名

如何让这个星型模式在Python中只使用一个for循环?

实现自定义QWidgets作为QTimeEdit的弹出窗口

提取相关行的最快方法—pandas

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

如何将数据帧中的timedelta转换为datetime

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

如何使用正则表达式修改toml文件中指定字段中的参数值

如何根据rame中的列值分别分组值

Python将一个列值分割成多个列,并保持其余列相同

使用python playwright从 Select 子菜单中 Select 值