【问题标题】:javascript steps climbing with recursion用递归爬升的javascript步骤
【发布时间】:2019-07-31 03:24:28
【问题描述】:

我的问题与this question 中的问题相同,但唯一的区别是我必须根据给定的允许步骤数组返回可以攀登台阶的方式数。例如,如果要爬的台阶是4,允许的台阶是[1,3],则结果应该是3。组合:[(1,1,1,1),(1,3),(3,1)]

我尝试将代码修改为:

function add(x,arr){
let result = 0
   if(x<0)
      return 0;

   if(x===0)
      return 1;

   else{for(let i=0 ; i<arr.length ; i++){
        result += add(x-arr[i]);
      }
      return result};  
}
add(4,[1,3])

但这会返回一个错误,说cannot read property length of "undefined"。我该如何纠正这个问题?

【问题讨论】:

  • 你怎么称呼add(x, arr)?该消息将清楚地表明arrundefined
  • add(x-arr[i]);
  • 对不起,我没有包括那个。这是调用 add 后的内容。

标签: javascript recursion


【解决方案1】:

在你的 else 条件下,

result += add(x-arr[i])

应该是

result += add(x-arr[i], arr)

【讨论】:

    【解决方案2】:

    一开始我误读了这个问题,很高兴展示如何将计算结果的递归函数转换为列出结果的递归函数。当我来到这里发布它时,我意识到这不是被要求的,但我仍然发现它是一个很好的例子,说明如何解决这个问题......所以无论如何我都会发布它。 :-)

    一个简单的计数解决方案,类似于问题中的解决方案(使用 Abbas Cyclewala 的修复)可以这样构造:

    const count = (n, ss) =>
      n < 0 ? 
        0 
      : n == 0 ? 
        1 
      :   // else
        ss.map(s => count(n - s, ss))
          .reduce((a, b) => a + b, 0)
    
    console .log (
      count (4, [1, 3])  //~> 3
    )

    我们可以通过注意0 的等价物是[] 来切换到结果列表而不是计数,1 的等价物是[[]],而不是添加所有递归结果,我们需要简单地连接它们。这只剩下对实际递归结果的更新,这并不难:如果第一步的长度为k,则在(n - k)上递归,并在每个结果前面加上k

    您可以看到它们在结构上是多么相似:

    const paths = (n, ss) => 
      n < 0 ? 
        [] 
      : n == 0 ? 
        [[]]
      :   // else
        ss.map(s => paths(n - s, ss).map(ps => [s, ...ps]))
          .reduce((a, b) => a.concat(b), [])
    
    console .log (
      paths (4, [1, 3]) //~> [[1, 1, 1, 1], [1, 3], [3, 1]]
    )

    所以这并没有回答最初的问题,但是如果有人想要它,就在这里!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-29
      • 2012-12-08
      • 1970-01-01
      • 2022-01-17
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多