微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 语言之间递归处理的差异

以下是一些不同语言的片段.

有问题的函数取自SICP,例如. 1.41.

Lisp的:

(define (double f) (lambda (x) (f (f x))))
(define (inc x) (+ x 1))
(((double (double double)) inc) 5)

Python:

def double(f):
  def result(x):
    return f(f(x))
  return result

def inc(x):
  return x + 1

double(double(double(inc)))(5)

使用Javascript:

var double = function(f) {
  return function(x) { return f(f(x)) };
};

var inc = function(x) { return x + 1  };

(double(double(double(inc))))(5);

ruby:

double = lambda {|f| lambda {|x| f[f[x]] } }
inc = lambda {|x| x+1 }
double[double[double[inc]]][5]

如果我不是疯了,这些函数应该做同样的事情并返回相同的结果.
但是,lisp版本返回21而其他版本返回13.你能解释一下这个区别吗?我错过了什么吗?

解决方法:

如何调用方案代码中的函数与其他函数不同.等效的python将是:

double(double(double))(inc)(5)

换句话说,方案代码创建一个函数,将另一个函数应用16次,并将该函数应用于inc. python创建应用inc 8次的函数;其他人的工作方式与python相同.

如果为中间步骤引入名称,差异可能会更清楚一些.在计划中:

(define quadruple (double double))
(define hexadecuple (double quadruple)) ; hexadecuple may not actually be a word... 
(define add16 (hexadecuple inc))
(add16 5)

我希望这是正确的语法;自从我用方案做了一些事以来已经有一段时间了.

在python中:

add2 = double(inc)
add4 = double(add2)
add8 = double(add4)
add8(5)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐