有时它很简单(如果自调用是最后一个语句,它是尾递归),但仍有一些案例让我感到困惑.一位教授告诉我"如果在自我调用之后没有执行指令,那就是尾递归".这些例子怎么样(忽略它们没有多大意义的事实):
a)这个应该是尾递归的,看看自调用是最后一个语句,并且在它之后没有任何东西可以执行.
function foo(n)
{
if(n == 0)
return 0;
else
return foo(n-2);
}
Run Code Online (Sandbox Code Playgroud)
b)但是这个怎么样?它应该是一个尾调用,因为如果条件为真,除了它之外什么都不会执行,但它不是最后一个语句?
function foo(n)
{
if(n != 0)
return foo(n-2);
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
c)这个怎么样?在这两种情况下,自我调用将是最后执行的事情:
function foo(n)
{
if(n == 0)
return 0;
else
{
if(n > 100)
return foo(n - 2);
else
return foo(n - 1);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一款使用六边形网格的TBS游戏.但是,我希望它是等距的(看起来很漂亮和像素艺术),并且平铺引擎运行良好,这是结果:

然而,要实现这一点,我必须摆弄值(平铺大小,平铺算法)以使平铺正确.这是一个示例图块:

图块大小为62x32,并且在平铺时,每个图块在x上移动47(cw),在y上移动16(ch)以正确拟合.
这是我如何从地图坐标计算屏幕坐标(用于绘制图块):
function toScreen(x, y, z, offset)
{
offset = ifndef(offset, {x: 0, y: 0});
var ret = new Vector2D(y*Tile.cw + x*Tile.cw -offset.x, -x*Tile.ch + y*Tile.ch -offset.y -z*16);
ret.y += (Tile.height*this.h)/2; //center the map on screen
return ret;
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要能够选择切片,并从屏幕(鼠标)坐标获取地图坐标.我无法弄清楚是否有可能以某种方式转换坐标(我的所有尝试都失败了).
这就是地图坐标系的样子以及如何绘制图块:

当然,瓷砖的选择必须是像素完美的,但仅适用于平面瓷砖(不需要选择覆盖上面瓷砖的树木),因此算法可以假设所有瓷砖都是平的(如同一个我举了一个例子).有没有人对如何做到这一点有任何想法?我可以通过将[0,0]处的图块转换为屏幕空间,然后查看指针是否在其中,或者距离是多远,然后慢慢地逐行走,直到找到一个包含鼠标坐标的图块(或者没有图块),但我正在寻找更优雅的解决方案(如果存在).
有没有人有任何想法?
谢谢.
我开始学习Scheme,主要是为了好玩,因为我之前从未使用过函数式语言.我之所以选择Scheme,是因为我想长时间阅读SICP.
无论如何,我目前正在学习列表,在此之前我了解了cons,car和cdr.还有一个例子可以创建一个带有缺点的列表列表,如下所示:
(cons (list 1 2) (list 3 4))
Run Code Online (Sandbox Code Playgroud)
结果列表是((1 2)3 4),这对我没有意义,我希望((1 2)(3 4))是结果(由两个列表组成的列表).为什么它表现得那样?我意识到,如果我要使用汽车,我会得到(1 2),而cdr我会得到(3 4)因为cdr总是返回"其余的",但我不明白为什么列表没有制作两个名单?
我被告知有几次在javascript中使用异常是"坏"的.没有真正被告知为什么它是坏的,但不是我应该使用休息,继续和返回.
哪个好,除了我不需要返回/中断/继续,我需要抛出.我有一个案例,我有迭代器函数嵌套在一起,每个都在调用时返回下一个值,所以我使用一个异常来表明没有什么可以迭代:似乎是一种逻辑方式来做,使代码干净并且在实践中完美地运作.是否真的有任何理由不在js中使用异常?
第二个问题,当我使用异常时,我应该抛出什么样的对象?对于错误,我显然会抛出Error的实例,但是对于特殊情况(停止迭代等),我需要一种快速方法来检查那些特定的异常,而我所做的只是定义一个空的命名函数(函数StopIteration(){因为函数通过引用进行比较,我总是可以检查它是否是我的特例或者我应该重新抛出.在js中有更好或更多的自我方式吗?我真的应该尝试重构我的代码避免使用异常吗?
谢谢
我正在编写一个页面,其中包含演示如何使用我的 js 库的示例。我希望这些示例是可编辑和可运行的,所以我想我有这些选项:
使用prettify在教程页面上显示代码,有一个按钮可以打开一个带有编辑器的新窗口,您可以在其中运行代码(当前实现的解决方案)。或者,我可以使编辑器成为某种模式对话框。
为页面上的每个示例使用多个 CodeMirror 编辑器(单个页面上最多可以有 30 个)。我不确定这些编辑器有多“重”,所以我不确定这是否是个好主意。
有一个编辑按钮,在需要编辑时用 CodeMirror 编辑器“交换”漂亮的代码,这样用户就可以编辑和运行示例而无需打扰新窗口。我不确定是否可以使美化和 CodeMIrror 的语法突出显示看起来相同。
关于我应该如何做以及为什么这样做的任何想法?我也乐于接受有关不同代码编辑器或语法高亮器的建议,所以如果有人对此类事情有经验,请告诉我您是如何做到的。