【问题标题】:"Mapping" Little Schemer to coderbyte challenge: Capitalize“映射” Little Schemer 到 coderbyte 挑战:大写
【发布时间】:2015-05-19 22:37:11
【问题描述】:

在学习了 The Little Schemer 的大部分内容后,我一直在尝试一些针对 Coderbyte 挑战的递归解决方案。

经过一番摆弄后,我投入了 cons 并认为我的 upperConsIt 可以浏览数组,找到特定字母的所有实例并将每个实例大写。最终,我将有一个数组,我可以将它转换为一个字符串,其中一个字母现在大写。

当我尝试像 cdr 一样使用 shift() 时会弹出错误。为什么是这样?在这种情况下,我需要做什么才能以递归方式使用 JavaScript?

'use strict';
var newArray = [];
var originalText = 'i will eat my sausage if i can';
var arrayToProcess = textIntoArray(originalText);

function cons(a, d) {
  return [a, d];
}

function textIntoArray(string) {
  return string.split('');
}

function upperConsIt(array, letter) {
  return array[0] === null ? null :
    array[0] === letter ? cons(array[0].toUpperCase(), upperConsIt(array.shift(), letter)) :
    cons(array[0], upperConsIt(array.shift(), letter));
}


upperConsIt(arrayToProcess, 'i');

console.log(arrayToProcess);

phantom.exit();

这是错误输出:

TypeError: undefined is not a constructor (evalating 'array.shift()')

我只是不明白这是一个类型错误。数组应该是数组吧?

【问题讨论】:

    标签: javascript arrays recursion scheme the-little-schemer


    【解决方案1】:

    列表是 2 个元素 ['t',['e',['s',['t',null]]]] 的嵌套数组。

    拆分为['t', 'e', 's', 't']

    array.shift() 发生变异。你真的应该使用这样的东西:

    function car(cons) {
      return cons[0];
    }
    
    function cdr(cons) {
      return cons[1];
    }
    

    【讨论】:

    • 我明白了。所以在刚刚内置的 JavaScript 中确实没有 cdr 等价物。
    • @GabrielKunkel 您的意思是内置的cdr 恰好与您选择的cons 实现相匹配?您可以轻松地将对象和carcdr 作为方法实现对。 (我会更喜欢)顺便说一句。 JavaScript 有 map 作为数组的方法,但它不使用对。
    • 我明白了。 Little Schemer 确实帮助我完全理解了递归,但如果不先构建等效库,它就无法转换为 JavaScript。基本上,您不能真正混合使用 The Little Schemer 函数和 JavaScript 内置方法。我原以为 map 方法只是使用 underscore.js,但现在其中一些是 ECMA 的一部分。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 2023-01-24
    • 2012-05-25
    • 2012-09-30
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多