- 核心思想: 最先用函数式思想来写算法, 把一切复杂过程用高阶函数来描述, 不断写纯函数, 不断高阶化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时间分片#快捷输入
-
- 用二维的表格或者矩阵存储数据(低维度的基本结构), 展示为高维的图或者树形结构, 而不要去存储高维结构,然后去解析高维结构生成高维结构
- 充分利用数据库或者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)