Skip to content

算法可视化开发,GPT辅助生成,函数式化后去递归的算法辅助开发脚手架平台

Notifications You must be signed in to change notification settings

chanshunli/algorithm-visualizer-gpter-fper

Repository files navigation

算法可视化开发,GPT辅助生成,函数式化后去递归的算法辅助开发脚手架平台

  • 核心思想: 最先用函数式思想来写算法, 把一切复杂过程用高阶函数来描述, 不断写纯函数, 不断高阶化f(... f(f(x))), 直到递归, 找到递归停止条件和递增出递减入, 必要时使用Datalog/Prolog逻辑式编程语言(基于递归不定序运行)来当脚手架开发算法, 或借用图数据库Datomic的力量来帮助开发算法, 最后用GPT翻译为其他语言如Java或Go => 变成本能的反应,天下武功唯快不破: 常用的Scaffold代码写成Elisp/Yasnippet组合模版, 输入几个命令参数就生成特定的算法
  • 写一个GPT的提示词工程界面, 用Python或最熟悉的Clojure作为提示词(高维输出高维度),辅助代码生成和运行的界面,通过项目和提示词历史,丰富提示词去提交,五六个UI界面窗口的实现

    • GPT生成的代码解析,静态分析和Datalog结合判断其逻辑是否准确性
    • 用Datalog来保存整个开发过程出现的提示词历史,还有repl历史, 以便更容易生成符合逻辑的提示词
  • 函数式递归的开发脚手架的实现:数据流可视化,分析递增递减

  • 数据流的可视化设计开发,lambda化数据流, 通过可视化数据流来帮助快速理解问题


  • [[递归算法]]

    • 递归算法一般用干解决三类问题:

    • 1、数据的定义是按递归定义的(斐液那契数列)

    • 2、问题解法按递归算法实现(回溯)

    • 3、数据的结构形式是按递归定义的(树的逼历,图的搜索)

  • [[贪心算法]]

    • 经典案例:活动选择问题

    • 1、最小生成树

    • 2、算法背包

    • 3、问题单源最短路径的 Diikstra算法

    • 4、Huffman压缩编码#快捷输入

  • [[回溯算法]]

    • 使用回湖算法的经典案例

    • 1、深度优先搜索

    • 2、0-1背包问题

    • 3、正则表达式匹配4、八皇后

    • 5、数独6、全排列#快捷输入

  • [[动态规划]]

    • 使用动态规划求解的一些经典问题

    • 1、爬楼梯问题

    • 2、背包问题

    • 3、硬币找零4、图的全源最短路径

    • 5、最长公共子序列#快捷输入

  • [[枚举算法]]

    • 使用枚举算法求解的一些经典问题

    • 1、判断阿姆斯特朗数

    • 2、解百鸡问题#快捷输入

  • [[分治算法]]

    • 使用分治法求解的一些经典问题

    • 1、二分查找

    • 2、归并排序

    • 3、快速排序

    • 4、汉诺塔问题

    • 5、React时间分片#快捷输入


思想

  • 太极来描述递归的对立统一的两面: eval,apply元解释器λ演算解释一切复杂算法

  • 函数式思想: 就是四两拨千斤, 就像太极一样 => FP的算法,递归描述算法是最简的统一算法的方式(解释器和所有算法的递归形式统一),接近数学,而不是堆栈的算法描述方式接近机器

算法可视化开发第一性原则

  • 用二维的表格或者矩阵存储数据(低维度的基本结构), 展示为高维的图或者树形结构, 而不要去存储高维结构,然后去解析高维结构生成高维结构
  • 充分利用数据库或者atom来存储中间过程, 然后API传给前端展示出来
  • 可视化前端驱动Repl lambda演算开发算法: 编写可视化的工具函数群,来快速可视化一个新的算法过程
  • 高阶函数描述复杂过程(fn ... (f2 (f1 x))) => 递归脚手架: 找到递归(递推的通项公式)终止条件(不同的算法递归描述的终止条件都不一样) => 去递归 => 去for循环,向量化
  • 先写死展示的数据,然后可视化开发结束(遵从易道),然后"吃饱"之后,最后变成灵活的自定义生成的数据,能够让人代入自身的易于理解的数据进去运行: 不要一上来就想着开发很完美的可视化过程,直接开发高维结构到高维结构的映射
  • 算法可视化开发如同吃饭天天吃,每天不断接近目标的可视化效果,直到最后能够随意代入自身数据进去运行,直接展示该算法的物理或现实意义: 刚开始从一个GraphViz图描述算法开始,慢慢细化,直到最后全部开发完一个算法的可视化过程
  • 先很粗暴的算法实现功能(暴力Repl人肉拟合未知函数), 然后对照旧的代码重写一遍
  • 代数进去算法得到局部打印的数列: 用等差和等比数列来表示所有数据的规律, 离散数据的规律, 发现数列的规律找到通项公式 或者是递推公式
  • 数学归纳法思想(有名(不同的算法的名字)万物(所有软件)之始,无名(数学归纳证明法)万物之母): 递归版本是最容易的, 运用万能的数学归纳法来证明所有复杂的公式定理,就算你完全不知道一个算法的名字,知道需求输入输出的样子,都能用递归描述出来 => 然后是非递归版本,用栈实现
  • 一切都是高阶函数, 包括字符串和数字(邱奇数的观点): 把amount当成一个高阶函数, 金额5的阶数和金额10的阶数是不同的, 金额10的一定量衰减就是金额5 => 当前的高阶函数数字 和 前一个高阶函数数字的关系是什么?(数学归纳法)
  • emacs yasnippad递归多分支的脚手架帮助开发算法
  • 打印prn信息来文学编程: 写成你能理解的方式就行 => log文学编程化

递归方法的总结

  • 找到不可变的定点,即最基本的底维度的结构,衰减问题不可变的规律: 先降维度最简描述定点(最基本的简单结构), 然后升维度(递归低维,高维结果展示出来)
  • 找到规律来缩小这个问题的搜索空间: 确定函数的定义域和值域的边界在哪里
  • 分段函数来cond求和结果
  • 尝试用代数穷举小的数字,来描述衰减前者和衰减后者的关系,如何消解问题: count_change(amount,n), count_change(amount,n-1), count_change(amount-衰减的钱,n) 抽取出来的因子的关系
  • 用递归脚手架来爆栈来尝试衰减你的目标变量
  • 平时独立思考和编码练习: 从几个衰减变量中找到前后者关系 => 从一个递推公式直接到递归脚手架写出代码
  • 用公式来表达多个情况相加, 然后排出不可能的组合方式(A1 = A0 + A(?)): count_change(amount,n) = count_change(amount,n-1) + count_change(amount-amount_of_first_coin,n)

算法可视化导航

如何在数组中找到直角三角形的组合?(map-reduce-filter式解法)

二叉搜索树

SICP找零钱问题(递推式递归解法)

About

算法可视化开发,GPT辅助生成,函数式化后去递归的算法辅助开发脚手架平台

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages