有没有更现代的,也许是面向对象的,相当于Jack Crenshaw的“ Let's Build a Compiler ”系列? 前段时间,我偶然发现了“ 让我们编译一个编译器 ”,并不能拒绝写一些代码。 我在C#中编写了一个输出.NET CIL的recursion下降C编译器。 “写一次,到处漏”是我的口号。 太糟糕了,我一直没有意识到parsingC是一个噩梦。 我现在感兴趣的是用Java编写Java编译器,输出.NET CIL或程序集,目标是自引导。 我希望有一些更新的教程可以踢。 顺便说一句,你会花更多的时间进行前期devise,还是只是写一大堆testing来支持无情重构的能力。 回想起来,我倾向于后者。 编译器工作,但代码真的很糟糕。
嗨,我有一个引用自己的表,我需要能够select父母和所有它是从一个给定的父母的Id的子logging。 我的表格如下: ID | ParentID | Name ———————– 1 NULL A 2 1 B-1 3 1 B-2 4 2 C-1 5 2 C-2 所以对于上面的例子,我希望能够传入1的值并获得上面的所有logging。 到目前为止,我已经提出了下面的recursion表值函数,但它不像预期的那样工作(只返回第一条logging)。 CREATE FUNCTION [dbo].[SelectBranches] ( @id INT ,@parentId INT ) RETURNS @branchTable TABLE ( ID INT ,ParentID INT ,Name INT ) AS BEGIN IF @branchId IS NOT NULL BEGIN INSERT INTO […]
我认为recursionCTE的格式已经足够写下来了,但是仍然发现自己不能手动处理一个(假装自己是SQL引擎,用笔和纸来达到结果集) 。 我find了这个 ,这与我正在寻找的接近,但不够详细。 我没有任何问题通过C ++recursion函数追踪并理解它如何运行 – 但对于SQL我不明白为什么或如何引擎知道停止。 锚和recursion块是否每次都被调用,或者在稍后的迭代中跳过锚点? (我对此表示怀疑,但是我试图expression自己对似乎跳跃的方式的困惑)。如果每次调用锚点,那么锚点在最终结果中不会多次出现? 我希望有人可以做第1行第2行,等等。结果集积累什么发生,什么是“内存中”。 我冒昧地从这个页面偷了我的例子 ,因为它似乎是最容易理解的。 DECLARE @tbl TABLE ( Id INT , [Name] VARCHAR(20) , ParentId INT ) INSERT INTO @tbl( Id, Name, ParentId ) VALUES (1, 'Europe', NULL) ,(2, 'Asia', NULL) ,(3, 'Germany', 1) ,(4, 'UK', 1) ,(5, 'China', 2) ,(6, 'India', 2) ,(7, 'Scotland', 4) […]
给定一段代码,你将如何确定一般的复杂性。 我发现自己对Big O的问题感到困惑。 例如,一个非常简单的问题: for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { System.out.println("*"); } } 电讯局长以类似组合的方式解释了这一点 就像这样,select2 =(n(n-1))/ 2 = n ^ 2 + 0.5,然后去掉这个常数使得它变成n ^ 2。 我可以把inttesting值,并尝试但这个组合的事情是怎么进来的? 如果这是一个if语句呢? 复杂性如何确定? for (int i = 0; i < n; i++) { if (i % […]
我已经编写了过去使用堆栈来检查平衡方程的软件,但是现在我被要求recursion地编写一个类似的algorithm来检查正确嵌套的括号和括号。 好例子:()[]()([]()[]) 不好的例子:((]([)] 假设我的函数被调用:isBalanced。 应该每次通过评估一个较小的子string(直到达到左边的基本情况)? 或者,我是否应该总是评估整个string并向内移动索引?
我已经试过put -r directory/* ,只上传文件而不是文件夹。 给我的错误, Couldn't canonicalise 。 任何帮助将不胜感激。
我很难理解为什么 #include <iostream> using namespace std; int fib(int x) { if (x == 1) { return 1; } else { return fib(x-1)+fib(x-2); } } int main() { cout << fib(5) << endl; } 导致分段错误。 一旦x下降到1不应该最终返回?
我试图编写一个函数,返回在Clojure memoizedrecursion函数,但我有困难使recursion函数看到自己的memoized绑定。 这是因为没有创buildvar? 另外,为什么我不能使用let创build的本地绑定使用memoize? 这个稍微不寻常的斐波那契序列制造商,从一个特定的数字开始,是我希望我能做的一个例子: (defn make-fibo [y] (memoize (fn fib [x] (if (< x 2) y (+ (fib (- x 1)) (fib (- x 2))))))) (let [f (make-fibo 1)] (f 35)) ;; SLOW, not actually memoized 使用with-local-vars似乎是正确的方法,但它也不适用于我。 我想我不能closuresvars? (defn make-fibo [y] (with-local-vars [fib (fn [x] (if (< x 2) y (+ (@fib (- x […]
这里有两个解决scheme在Cay Horstmann的Scala中为Impatient执行4.9:“编写一个函数lteqgt(values:Array [Int],v:Int),返回一个三元组,它包含小于v的值,等于v,大于v“。 一个使用尾recursion,另一个使用while循环。 我认为两者都会编译成相似的字节码,但是while循环比尾recursion要慢2倍。这表明我的while方法写得不好。 import scala.annotation.tailrec import scala.util.Random object PerformanceTest { def main(args: Array[String]): Unit = { val bigArray:Array[Int] = fillArray(new Array[Int](100000000)) println(time(lteqgt(bigArray, 25))) println(time(lteqgt2(bigArray, 25))) } def time[T](block : => T):T = { val start = System.nanoTime : Double val result = block val end = System.nanoTime : Double println("Time = " + […]
Java 8引入了lambda函数,我想实现像factorial: IntToDoubleFunction fact = x -> x == 0 ? 1 : x * fact.applyAsDouble(x-1); 编译返回 error: variable fact might not have been initialized 我怎样才能引用函数本身。 类是匿名的,但实例存在:它被称为fact 。