如何解决为河内塔生成一个元组
我的班级最近向我们介绍了元组,很快就给我们造成了一个著名的“河内塔”问题。本质上,我们应该为河内塔中板块的每次运动创建一个(源,目标)元组。教授给了我们这段代码,没有太多解释:
disposable = apiServiceGroups.getGroupsList(String.format("{\"offset\":%s}",groupCount))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<GroupsListResponse>() {
@Override
public void accept(GroupsListResponse groupsListResponse) throws Exception {
for (int i = 0; i < groupsListResponse.getGroups().size(); i++) {
String currentName = groupsListResponse.getGroups().get(i).getGroupFullName();
if (groupName.equals(currentName.split(" ")[0])) {
familiar.add(currentName);
}
}
}
},new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("thro",Objects.requireNonNull(throwable.getMessage()));
}
});
我快要亏本了。 (极点分别标记为极点1、2和3。样本输入def hanoi(n,src,des,aux):
if n == 1:
return ((src,des),)
else:
return hanoi(n-1,aux,des) + (((src,) + hanoi(n-1,src))
将产生hanoi(1,1,3,2)
,指示该步骤从极点1到极点3的运动。)
好的,我知道基本情况是什么。如果我只有1个板,则将其直接从源极移到目标极。除此之外,我知道((1,3),)
是递归步骤,旨在模拟将n-1张光盘留在原始堆栈中的时间。但是为什么hanoi(n-1,des)
交换aux,des和src的位置让我感到困惑。
我也不太明白为什么hanoi(n-1,src)
语句被安排为else:
?
任何提示和建议将不胜感激!我已经花了好几个小时来观察模式,并且通过画出图形来了解游戏规则,但是我无法理解如何将其转换为计算机(Python)逻辑。
谢谢!
解决方法
有关视觉效果的完整说明
为什么河内(n-1,aux,des,src)交换职位 aux,des和src。
在以下链接中:
https://www.geeksforgeeks.org/python-program-for-tower-of-hanoi/
https://runestone.academy/runestone/books/published/pythonds/Recursion/TowerofHanoi.html
关于最后一个问题:
我也不太明白为什么else:语句被安排为 hanoi(n-1,src,aux,des)+((((src,des),))+ hanoi(n-1,aux,des, src))?
这是因为您需要一组步骤,因此您需要将运动添加到该步骤中。
因此,可以说每个调用都返回一个元组[((src,des),)
]的元组,例如,使用哑函数:
def f():
return((1,2),) + ((2,3),) + ((1,)
它返回每个元组的“和”,这将为您提供一个串联的元组。
,在n层,您必须将n-1个板从src移至aux(中间存储极):hanoi(n-1,src,aux,des)
然后您将在src上找到最大的板块,可以将其从src移至dest:(((src,)
最后,您必须将所有n-1个板块从aux移到dest(使用src作为新的中间极点):hanoi(n-1,des,src))
因此需要调换职位。
该函数计算所有移动的列表,如下所示
为hanoi(2,'pole1-src','pole2-dest','pole3-aux')
(('pole1-src','pole3-aux'),('pole1-src','pole2-dest'),('pole3-aux','pole2-dest'))```
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。