标签: imperative-programming

将命令式Java转换为功能性Java(游戏)

我正在学习更多关于Java 8及其功能的知识,我想用它做更多的练习.比方说,我有以下命令性代码,用于围绕屏幕边界包裹一个圆圈:

if (circle.getPosition().getX() > width + circle.getRadius()){
    circle.getPosition().setX(-circle.getRadius());
}else if (circle.getPosition().getX() < -circle.getRadius()){
    circle.getPosition().setX(width + circle.getRadius());
}
if (circle.getPosition().getY() > height + circle.getRadius()){
    circle.getPosition().setY(-circle.getRadius());
}else if (circle.getPosition().getY() < -circle.getRadius()){
    circle.getPosition().setY(height + circle.getRadius());
}
Run Code Online (Sandbox Code Playgroud)
  1. 我怎么能试着"功能化"呢?也许有些伪代码?在我看来,在这个例子中,可变性和状态似乎是固有的.
  2. 功能编程不适合游戏开发吗?我喜欢这两者,所以我想把它们结合起来.

java functional-programming imperative-programming declarative-programming java-8

12
推荐指数
1
解决办法
370
查看次数

使用Struct库的快速不连续指针(静态,拆箱等)

我有兴趣为在Haskell中实现命令式语言的项目使用更有效的指针.已有一个库:Struct.有一篇博客文章简要文档.

问题是链接树只有一个非常复杂的例子.对于像我这样每天不使用Haskell的人来说,与文档代码,模板haskell等进行战斗是相当费力的.

我需要一个简单的例子来开始,沿着表达这两种数据类型的方式:

import Data.IORef

data DLL a = DLL a (Maybe (IORef (DLL a))) (Maybe (IORef (DLL a)))

data DLLINT = DLLINT Int (Maybe (IORef DLLINT)) (Maybe (IORef DLLINT))
Run Code Online (Sandbox Code Playgroud)

对于熟练使用Haskell/GHC的人来说,这应该只是一些简单的界限.

如何使用Struct库表达上述数据类型之一?

haskell pointers imperative-programming ghc

12
推荐指数
1
解决办法
155
查看次数

用表查找替换函数

我一直在和Brian Beckman一起观看这个MSDN视频,我想更好地理解他说的话:

每个不完美的程序员都经历了这个学习阶段,可以用表查找替换函数

现在,我是一名从未上过大学的C#程序员,所以也许在某个地方,我错过了其他人学会理解的东西.

Brian的意思是:

函数可以用表查找替换

是否有这方面的实际例子,是否适用于所有功能?他给出了我能理解的sin函数的例子,但是我如何用更一般的术语来理解它?

functional-programming lookup-tables imperative-programming

11
推荐指数
2
解决办法
1690
查看次数

Python编程功能与命令式代码

所以我目前正在课堂上学习3种主要的编程范例.我知道python使用了功能和命令式范例.我正在寻找这些范例的python中的简短示例代码,以便在明天的考试之前更好地理解这一点.谢谢!

python functional-programming imperative-programming

11
推荐指数
2
解决办法
7379
查看次数

C是命令式还是声明式编程语言

知道命令式和声明式编程之间的区别是否可以解释现实世界中两者之间的差异,这是非常令人困惑的?

请澄清C是否是一种命令式或声明式语言?

c imperative-programming declarative-programming

11
推荐指数
3
解决办法
8175
查看次数

在OCaml中退出循环的惯用例外

在OCaml中,可以通过引发异常提前退出命令式循环.

虽然在OCaml中使用命令式循环本身并不是惯用语,但我想知道在早期退出时模拟命令式循环的最惯用方法是什么(考虑到性能等方面,如果可能的话).

例如,旧的OCaml FAQ提到例外Exit:

Exit:用于跳出循环或函数.

它仍然是最新的吗?该标准库简单地提到它作为一个通用的异常:

Exit异常没有被任何库函数提高.它可以在您的程序中使用.

与此相关,这个回答另外一个问题提到使用预计算let exit = Exit例外,以避免在循环中分配.它还需要吗?

此外,有时人们想要从具有特定值的循环中退出,例如raise (Leave 42).是否有惯用的例外或命名约定来执行此操作?在这种情况下我应该使用引用(例如let res = ref -1 in ... <loop body> ... res := 42; raise Exit)吗?

最后,Exit在嵌套循环中的使用可以防止某些人想要退出几个循环的情况,比如break <label>在Java中.这将需要定义具有不同名称的异常,或者至少使用整数来指示应退出多少范围(例如Leave 2,指示应退出2个级别).同样,这里有一个惯用的方法/异常命名吗?

ocaml loops idiomatic imperative-programming

9
推荐指数
1
解决办法
594
查看次数

函数式编程是命令式编程的一个子集吗?

函数式编程的一个主要特征是使用无效函数.但是,这也可以用命令语言来完成.递归和lambda函数(例如C++ 0x)也是如此.因此,我想知道命令式编程语言是否是功能性编程语言的超集.

programming-languages functional-programming imperative-programming

8
推荐指数
2
解决办法
1293
查看次数

在简单情况下使用反应式编程的原因

请有人可以解释一下使用反应式样式的优点:

Observable<String> greeting = Observable.just("Hello");
Observable<String> yelling = greeting.map(s -> s.toUppercase());
Run Code Online (Sandbox Code Playgroud)

而不是简单的命令式样式:

String greeting = "Hello";
String yelling = greeting.toUppercase();
Run Code Online (Sandbox Code Playgroud)

我了解响应式编程,例如用于数据库访问,UI,计算,网络访问等的“ API”。但是为什么我们需要使用响应式编程来简化 toUppercase

imperative-programming reactive-programming rx-java rx-java2

8
推荐指数
3
解决办法
3048
查看次数

为什么函数式编程语言支持自动记忆而不是命令式语言?

这是我在互联网上随机发现的关于动态编程的一些讲座中读到的一个问题.(我毕业了,我已经知道动态编程的基础了)

在解释为什么需要记忆的部分,即

// psuedo code 
int F[100000] = {0};
int fibonacci(int x){
    if(x <= 1) return x;
    if(F[x]>0) return F[x];
    return F[x] = fibonacci(x-1) + fibonacci(x-2);
}
Run Code Online (Sandbox Code Playgroud)

如果没有使用memoization,那么许多子问题将被重新计算很多次,这使得复杂性非常高.


然后在一个页面上,笔记有一个没有答案的问题,这正是我想问的问题.在这里,我使用的是准确的措辞及其显示的示例:

自动记忆:许多函数式编程语言(例如Lisp)都内置了对memoization的支持.

为什么不用命令式语言(例如Java)?

说明提供的LISP示例(它声称它是有效的):

(defun F (n)
    (if
        (<= n 1)
        n
        (+ (F (- n 1)) (F (- n 2)))))
Run Code Online (Sandbox Code Playgroud)

它提供的Java示例(它声称它是指数的)

static int F(int n) {
  if (n <= 1) return n;
  else return F(n-1) + F(n-2);
}
Run Code Online (Sandbox Code Playgroud)

在阅读本文之前,我甚至不知道在某些编程语言中内置支持memoization.

笔记中的声明是真的吗?如果是,那么为什么命令式语言不支持呢?

lisp java theory functional-programming imperative-programming

7
推荐指数
1
解决办法
325
查看次数

使用break-s/continue-s将命令控制流转换为haskell

考虑以下命令性代码,它找到3位数字产品中最大的回文(是的,它是"18世纪优秀数学家的项目"网站的首批任务之一):

curmax = 0
for i in range(999,100):
for j in range(999,100):
    if ((i*j) < curmax): break
    if (pal(i*j)):
        curmax = i*j
        break
print curmax
Run Code Online (Sandbox Code Playgroud)

当我正在学习Haskell时,我的问题是,你如何将这个(以及基本上任何包含比简单迭代更复杂的命令式构造,例如中断,继续,临时变量和所有这些)转换为Haskell?

我的版本是

maxpal i curmax
    | i < 100 = curmax
    | otherwise = maxpal (i-1) (innerloop 999)
    where 
        innerloop j
            | (j < 100) || (p < curmax) = curmax
            | pal p = p
            | otherwise = innerloop (j-1)
            where p = i*j
main = print $ maxpal 999 0
Run Code Online (Sandbox Code Playgroud)

但这看起来我们仍然处于势在必行的丑陋城市. …

haskell functional-programming imperative-programming

6
推荐指数
2
解决办法
1966
查看次数