Understanding recursive fibonacci function in Haskell

后端 未结 1 1660
时光取名叫无心
时光取名叫无心 2021-01-15 07:51

Although this thread were available, I wasn\'t allowed to ask my question under the answers (due to reputation points) therefore I had to create a new question for that rega

相关标签:
1条回答
  • 2021-01-15 08:40

    Let's write this out with some more labels:

    fibs :: [Integer]
    fibs = 1 : 1 : sumft
     where sumft = zipWith (+) fibs tfi
           tfi = tail fibs
    

    Then, the “starting step” is

               ╭── tfi ───────┈┄··
    fibs : [1, 1, ?, ?, ...
                  ╰── sumft ──┈┄··
    tfi  : [1, ?, ?, ?, ... 
    sumft: [2, ?, ?, ?,

    Now, as the computation marches on, the runtime don't move anything or whatever, it merely tries to fill in ? signs with concrete values. Remember, everything in Haskell is immutable; when I write ? I just mean I don't know yet what the value there is, but in principle it's already predetermined.

    In this case, the runtime knows that the first ? in fibs comes from the head of sumft, whose exact value is known by now:

               ╭─── tfi ──────┈┄··
    fibs : [1, 1, 2, ?, ...
                  ╰─◀ sumft ──┈┄··
    tfi  : [1, ?, ?, ?, ... 
    sumft: [2, ?, ?, ?,

    Now, this 2 is also known in tfi:

               ╭──▶ tfi ──────┈┄··
    fibs : [1, 1, 2, ?, ...
                  ╰── sumft ──┈┄··
    tfi  : [1, 2, ?, ?, ... 
    sumft: [2, ?, ?, ?,

    ...and thus we can perform the next addition:

               ╭─── tfi ──────┈┄··
    fibs : [1, 1, 2, ?, ...
                  ╰── sumft ──┈┄··
    tfi  : [1, 2, ?, ?, ... 
    sumft: [2, 3, ?, ?,

    So, another number, i.e. another element of sumft that, being part of fibs, can also be used there. But it still occurs at the same place relative to the head of sumft – i.e. after the 2.

               ╭─── tfi ──────┈┄··
    fibs : [1, 1, 2, 3, ...
                  ╰─◀ sumft ──┈┄··
    tfi  : [1, 2, ?, ?, ... 
    sumft: [2, 3, ?, ?,

    That gets again used in tfi

               ╭──▶ tfi ──────┈┄··
    fibs : [1, 1, 2, 3, ...
                  ╰── sumft ──┈┄··
    tfi  : [1, 2, 3, ?, ... 
    sumft: [2, 3, ?, ?,

    ...and so on and so on.

    0 讨论(0)
提交回复
热议问题