为河内塔生成一个元组

问题描述

我的班级最近向我们介绍了元组,很快就给我们造成了一个著名的“河内塔”问题。本质上,我们应该为河内塔中板块的每次运动创建一个(源,目标)元组。教授给了我们这段代码,没有太多解释:

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'))```

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...