Scheme SICP计数变更问题&x2014;为什么N=X+;Y

Scheme SICP计数变更问题&x2014;为什么N=X+;Y,scheme,computer-science,sicp,Scheme,Computer Science,Sicp,我是一个潜伏的门外汉,目前正在努力阅读《圣经》的第一章 我遇到过“计数变化”示例过程,尽管我理解该过程本身,但我仍在与它所基于的前提作斗争: 假设我们认为可用的硬币类型是按某种顺序排列的。那么以下关系成立: 使用n种硬币改变金额的方法数量等于 除第一种硬币外,使用其他硬币改变金额的方法的数量,以及 使用所有n种硬币改变数量a-d的方法的数量,其中d是第一种硬币的面额 要了解为什么这是真的,可以观察到改变的方法可以分为两组:不使用任何第一种硬币的方法和使用第一种硬币的方法。因此,对某一金额

我是一个潜伏的门外汉,目前正在努力阅读《圣经》的第一章

我遇到过“计数变化”示例过程,尽管我理解该过程本身,但我仍在与它所基于的前提作斗争:

假设我们认为可用的硬币类型是按某种顺序排列的。那么以下关系成立:

使用n种硬币改变金额的方法数量等于

  • 除第一种硬币外,使用其他硬币改变金额的方法的数量,以及

  • 使用所有n种硬币改变数量a-d的方法的数量,其中d是第一种硬币的面额

要了解为什么这是真的,可以观察到改变的方法可以分为两组:不使用任何第一种硬币的方法和使用第一种硬币的方法。因此,对某一金额进行更改的方式总数等于不使用任何第一种硬币的情况下对该金额进行更改的方式数,加上假设我们使用第一种硬币的情况下进行更改的方式数但后一个数字等于使用第一种硬币后剩余金额的兑换方法数。

问题和过程在上下文中是可用的,但我不包括过程,因为我正在努力解决的是上面的逻辑,而不是过程本身

我不明白的是,为什么这些都是平等的:

  • “方式”的总数,小于在不使用第一种硬币的情况下获得全额的“方式”
  • 在减去第一枚硬币的面额后,使用所有类型的硬币制作剩余金额的“方式”的数量
  • 我已经手动运行了无数个测试示例,是的,这种关系是正确的,但我不明白为什么

    他们解释的第一句话很有意义:

    注意,改变的方法可以分为两组:不使用任何第一种硬币的方法和使用第一种硬币的方法

    如果我们有“方法”的总数,我们可以根据这个规则将总数分成两组。没问题

    第二句话也很清楚:

    因此,对某一金额进行更改的方式总数等于不使用任何第一种硬币的情况下对该金额进行更改的方式数,加上假设我们使用第一种硬币的情况下进行更改的方式数

    这简单地说,总的方法数是被分为两类的方法的总和。嗯

    这就是他们失去我的地方:

    后一个数字等于使用第一种硬币后剩余金额的兑换方法的数量

    我认为这意味着“后一个数字”指的是所有必须使用第一个面额中至少一枚硬币进行兑换的方式

    为什么以及如何使这个数字等于所有硬币的总金额减去第一枚硬币的面额的兑换方式的数量?

    为了试着想象这个问题,我重申了这一点,即试图在一个杠铃上达到80公斤的特定重量,有一套3种重量单位:

  • 红色:5公斤
  • 绿色:10公斤
  • 蓝色:20公斤
  • 我把每一个场景都形象地展示了出来,事实上,这种关系是成立的,但我仍然不明白为什么:


    感觉这个问题的答案就在我眼前,但也许这个特殊附属物的巨大尺寸将永远掩盖这个答案。

    让我们想象一种简化的货币,只有1和5个面额。我要求你们拿出15英镑,规定你们给我的硬币中至少有一枚必须是5英镑。你有多少种方法可以做到这一点?在这一点上,你可以尝试产生所有的方法来产生15英镑的变化,然后扔掉所有不符合我要求的。但很容易观察到,你也可以先留出一个5英镑来满足我的需求,然后想出如何用你选择的任何方式来兑换剩余的10英镑。

    这里的诀窍是,考虑到一堆硬币的面额,其中一种我们称之为d,有两种方法可以兑换一定数量的a:

    • 不要使用任何面额为d的硬币
    • 至少使用一个d(我指的是“d”所指的“d”面额硬币)
    而做出改变的方式总数就是这两种方式的总和(特别是我们没有错过任何其他方式)

    因此,在第一种情况下,我们可以使用除d以外的所有面额来计算进行更改的方式的数量(显然,我们将通过选择其他面额来进行计算&递归地使用我们将要使用的技巧)


    在第二种情况下,我们将使用至少一个d。所以我们知道,因为我们使用了至少一个d,所以A的量可以被分成A=d+(A-d):这就是“使用至少一个d”的意思。那么现在有多少种方法可以组合成这样的硬币呢?好的,答案是,这是一个数量(A-d)的改变方式的数量,除了这次我们仍然允许使用ds进行改变。

    在其他响应者的帮助下思考了几天之后,我认为这个问题可以得到澄清(至少对我来说)通过在书的原始解释后添加详细说明,该行内容如下:

    但后一个数字等于使用第一种硬币后剩余金额的兑换方法的数量

    我将新的一段措辞如下:

    这是因为我们可以假设,的每一种组合必须至少包含我们已经拥有的第一种硬币中的一种
    (define (loadways weight plates)
    (cond
       [(= weight 0) 1]
       [(or (= (length plates) 0) 
            (< weight 0)
            ) 0]
       [else (+ (loadways weight (cdr plates))
                (loadways (- weight (car plates)) plates))]
       ))  
    
    (define weight-rack (list 20 10 5))
    
    (loadways 40 weight-rack)