python-> scheme转换的问题

我目前正在尝试使用方案语义编写Python程序,以便稍后可以将其转换为Scheme而不依赖于许多Pythonic的东西.

我正在尝试使用*,深度优先和广度优先搜索算法来解决滑动拼图问题(其中您有9个插槽和8个拼贴排列在一个正方形中).我在11年前在Lisp的一些AI课上做过这个,但基本上当时我不知道lisp,我全心全意地讨厌它,只有回想起来我才意识到我在Lisp中编写了“C”.教授在这件事上没有帮助.

我有一个python函数,可以轻松交换两个tile:

def swap(p, (r1, c1), (r2, c2)):  
    # Swaps *any* two locations and returns new configuration  
    # Does not concern itself with zero location, etc  
    # Not sure how to do this functionally  
    p_p = p[:]  
    temp = p_p[r1][c1]  
    p_p[r1][c1] = p_p[r2][c2]  
    p_p[r2][c2] = temp  
    return p_p  

我想把它变成你可能在SICP中找到的东西,避免副作用等.

但这提出了一个问题.我在SICP中读到的所有东西都是通过递归循环.在常量时间访问数组/向量/列表时没有看到任何内容.我可以想象一种循环/递归方式来读取一个元素,但我发现很难想象一种方法来创建一个新的列表,其中某个元素被更改,而不会调用副作用产生像set!这样的东西,而不是诉诸于疯狂如果/ then / else有关应该更改哪个元素的子句.当考虑二维阵列时,这当然会变得更加混乱.在这种情况下,使用python的解决方案是显而易见的,因为它对多维数组的本机支持.

在C/C++ / Python / Matlab / Lua /其他任何东西中,通过[i]语法访问列表/数组很容易,并直接转换为下面某处的面向硬件的指针查找.考虑到SICP版本的方案中定义的原子操作,我看不出方案如何做到这一点,这些操作看起来都非常以循环和搜索为导向.向量和列表数组访问函数如何工作以获得恒定的时间访问? (我在这里总是新手,所以我不确定我会谈论什么功能).在秘密访问的某个地方是否有C或汇编库?在方案中是否有任何固有的常量时间语义可用于列表/数组/向量访问,这将允许我在Python中使用该成语的无罪方式?

如何使用Schemish语义在python中重写上述函数?我如何在Scheme中重写上述函数?

解决方法:

您发现您的初始问题是尝试在Lisp中编写C语义.是不是重复错误尝试在python中编写方案语义?我总是尝试将语言X作为一种范式学习,就像语言一样,并以最简单的方式写作.

如果这是一个你知道将要迁移的业务应用程序,那么这可能是合理的,但除此之外,我只是将其写入计划中.

上一篇:django优化--ORM查询


下一篇:Android_studio调字体大小