功能编程,递归游戏状态循环

Pet*_*ter 3 recursion functional-programming

我打算写一个简单的游戏来测试我对函数式编程的理解.执行主循环的功能方法是递归它,但是当生成越来越多的堆栈帧时,这不会占用内存吗?

谢谢

一个例子来自如何在没有可变状态的情况下做任何有用的事情?

// imperative version
pacman = new pacman(0, 0)
while true
    if key = UP then pacman.y++
    elif key = DOWN then pacman.y--
    elif key = LEFT then pacman.x--
    elif key = UP then pacman.x++
    render(pacman)

// functional version
let rec loop pacman =
    render(pacman)
    let x, y = switch(key)
        case LEFT: pacman.x - 1, pacman.y
        case RIGHT: pacman.x + 1, pacman.y
        case UP: pacman.x, pacman.y - 1
        case DOWN: pacman.x, pacman.y + 1
    loop(new pacman(x, y))
Run Code Online (Sandbox Code Playgroud)

wal*_*pus 5

你已经loop使用尾递归实现了你的函数,即递归调用loop是函数中的最后一件事.这允许编译器/解释器(取决于语言)立即弹出当前堆栈帧并将其替换为递归调用的帧.

简而言之,你实现它的方式,没有堆栈溢出,并且loop可以根据需要运行.