TS实现汉诺塔算法,以及图灵完备讨论
之前在网上看到徐大佬更新的一篇文章:

在线预览地址:https://tsplay.dev/Nd4n0N 把鼠标放在最后几行的走棋结果上,惊喜的一幕出现了,有点发现新大陆的感觉,哇,炫酷。
后面就很好奇,是如何实现的呢?

我们先看大佬说的第一句话,“众所周知,TypeScript 是图灵完备的……”为什么说ts是图灵完备的呢?下面开始了我的探索。
什么是图灵完备?
维基百科是这样定义的:
即如果一个设备可以模拟图灵机,那么它就可以执行任何种类的计算。

它意味着任何实现以下八条指令的机器都是一台计算机(因此可以执行任何种类的计算)。
.,: 输入或输出一个指令+-: 加或减内存中的值><: 将当前的指针向左或向右移动。[]: 执行循环
如果某种语言可以执行以上八种指令,就可以称为是图灵完备的。
我们用以上八种指令,验证一下,狗狗是否是图灵完备的,狗狗叫小花。

1、输入/输出
我拍了拍小花的头,她看了看我,然后继续趴着。
输入:拍头
输出:抬头,趴着
完成!
2、增加/减少内存中的值

瓷砖格子很像图灵机的纸条,我把狗粮撒在瓷砖上,小花可以直接从地板吃下去,她可以吃掉,也可以吐出来。
所以她可以增加/减少内存中的值。
完成!
3、将当前记忆头指针向前或向后移动

一天,小花跟yoyo疯跑,把她的饭盒移动,狗粮撒的到处都是。
如上图,在制造这个混乱的时候,她把她的饭盒移开了。
移开她的饭盒意味着她会把她的狗粮洒在另一块瓷砖上。
这算作转移记忆头,编辑另一个记忆单元。存储指针移动啦!
完成!
4、执行循环

刚把地上打扫干净,小花一会又把地上弄乱了。
实现循环
完成!
以上,我们证明小花是图灵完备的,那如何利用她的完备性进行程序计算呢?
好吧,让小花来执行一段:
好像不行哎~
尽管她是图灵完备的,但也不是专门用来程序计算的。所以能进行程序计算的一定是图灵完备的,图灵完备的不一定能进行程序计算。
不过,既然可以实现象棋,而且是用中文写的哦,超级厉害!
那TS是可以进行计算的,我也来试试吧!
之前公众号写过python实现汉诺塔的图解递归算法,改改
//核心:每个类型可以看成一个函数,传入的泛型是函数参数,并且也是一个类型,最后再返回一个新的类型
type 塔一 = 'A' type 塔二 = 'B' type 塔三 = 'C' // type 塔 = 塔一 | 塔二 | 塔三
type 得到长度<数组 extends any[]> = 数组["length"]; //exstends 和后边的 ? 构成了一个三元表达式,如果 extends 前面的类型能够赋值给 extends 后面的类型,那么表达式判断为真,否则为假。
type 转为数组< 某数 extends number, 对应数组 extends any[] = [] // 默认值赋一个空数组,外部调用的时候不需要传 > = 得到长度<对应数组> extends 某数 // 长度是否等于了需要的长度 ? 对应数组 // 如果长度等于所需要的了就返回 : 转为数组<某数, [any, ...对应数组]>; // 否则再添加一个元素进入数组,然后递归调用 type 相加<某数甲 extends number, 某数乙 extends number> = 得到长度< [...转为数组<某数甲>, ...转为数组<某数乙>]
>; type 数组减一<某数组类型 extends any[]> = (( ...参数: 某数组类型 ) => any) extends (拆一个元素: any, ...剩下的数组: infer 剩下的数组类型) => any ? 剩下的数组类型 : []; //将数字转为对应数组,数组减去一个元素,然后恢复为数字即可。
type 减一<某数 extends number> = 得到长度<数组减一<转为数组<某数>>>; //汉诺塔关键函数
type 汉诺塔<某数 extends number,塔一,塔二,塔三> = 某数 extends 1 ? [塔一,"--->",塔三]
:
[汉诺塔<减一<某数>,塔一,塔三,塔二>,
[塔一,"--->",塔三],
汉诺塔<减一<某数>,塔二,塔一,塔三>] //渲染
type 测试 = 汉诺塔<3,塔一,塔二,塔三>

其中还涉及ts相关知识点,详细了解typeScript,不做详细展开说明了。
TS实现汉诺塔算法,以及图灵完备讨论的更多相关文章
- 汉诺塔算法详解之C++
汉诺塔: 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆环,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置 ...
- 汉诺塔算法的递归与非递归的C以及C++源代码
汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...
- Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法-un
ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法 Java 实例 汉诺塔(又称河内塔)问题是源 ...
- java利用递归实现汉诺塔算法
package 汉诺塔; //引入Scanner包,用于用户输入 import java.util.Scanner; public class 汉诺塔算法 { public static void m ...
- java实现汉诺塔算法
package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * * 题目:汉诺塔算法(本 ...
- 汉诺塔算法c++源代码(递归与非递归)[转]
算法介绍: 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n - 1(有兴趣的可以自己证明试试看).后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了.首先把三根柱 ...
- Java汉诺塔算法
汉诺塔问题[又称河内塔]是印度的一个古老的传说. 据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把 ...
- python实现汉诺塔算法
汉诺塔 算法分析 1.步骤1:如果是一个盘子,直接将a柱子上的盘子从a移动到c 否则 2.步骤2:先将A柱子上的n-1个盘子借助C移动到B(图1) 已知函数形参为hanoi(n,a,b,c),这里调用 ...
- 如何用Go语言实现汉诺塔算法
package main import ( "fmt" ) func print(n int,x rune,y rune)(){ fmt.Printf("moving d ...
- python 递归实现汉诺塔算法
def move(n,a,b,c): if (n == 1): print ( "第 ", n ," 步: 将盘子由 " ,a ," 移动到 &quo ...
随机推荐
- 简单解决jsp中文乱码问题
简单解决jsp中文乱码问题 初学jsp制作一个简单的响应页面 具体代码如下: <form action="test.jsp"> username : <input ...
- typedef和define有什么区别
typedef 和define 都是替一个对象取一个别名,以此增强程序的可读性,区别如下: 使用不用 define 定义后面不用加分号,并且它的别名在对象的前面 typedef需要加分号,并且它的别名 ...
- C# HttpClient请求gzip
//设置HttpClientHandler的AutomaticDecompression var handler = new HttpClientHandler() { AutomaticDecomp ...
- C# Task 实现任务超时取消、超时取消然后重试 超过重试最大次数就结束。
任务超时取消 示例 public static async Task TimeoutCancelTask() { CancellationTokenSource cts = new Cancellat ...
- Mysql高级3-索引的结构和分类
一.索引概述 1.1 索引的介绍 索引index:是帮助 Mysql 高效获取数据 的 有序的数据结构,在数据之外,数据库系统维护着的满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据 ...
- 「Python实用秘技16」快速提取字体子集
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第16 ...
- loopback4:单元测试冻结时间
解决方案 import {expect} from '@loopback/testlab'; import sinon from 'sinon'; describe('example test', ( ...
- 2023-08-04:村里面一共有 n 栋房子 我们希望通过建造水井和铺设管道来为所有房子供水。 对于每个房子 i,我们有两种可选的供水方案: 一种是直接在房子内建造水井 成本为 wells[i -
2023-08-04:村里面一共有 n 栋房子 我们希望通过建造水井和铺设管道来为所有房子供水. 对于每个房子 i,我们有两种可选的供水方案: 一种是直接在房子内建造水井 成本为 wells[i - ...
- cesium加载gif图片(cesium篇.43)
https://blog.csdn.net/QQ98281642/article/details/120214325
- CSS3新增了哪些选择器?(属性、结构伪类、伪元素选择器)
在css3提供的新选择器之前,选择一个元素需要借助id或者class,css3新增的选择器可以更灵活的去选择需要的元素,那css3提供了哪些好用的选择器呢? 首先就是属性选择器,我们可以通过属性选择器 ...