gpt4 book ai didi

scheme - 循环形式的命名 let 是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 05:30:02 27 4
gpt4 key购买 nike

在解释如何将数字转换为列表的 an answer 中,number->list 过程定义如下:

(define (number->list n)
(let loop ((n n)
(acc '()))
(if (< n 10)
(cons n acc)
(loop (quotient n 10)
(cons (remainder n 10) acc)))))

这里使用了“ named let ”。我不明白这个名为 let 的工作原理。

我看到定义了一个循环,其中变量 n 等于 n ,变量 acc 等于空列表。然后,如果 n 小于 10,则 n 被分配给 acc。否则,“循环”应用 n 等于 n/10acc 等于 n/10 的余数和之前累积的东西的 cons,然后调用自身。

我不明白为什么 loop 被称为循环(什么是循环?),它如何自动执行和调用自己,以及它如何实际将每个数字乘以适当的乘数以形成一个以 10 为底的数字。

我希望有人可以对程序和上述问题有所了解,以便我更好地理解它。谢谢。

最佳答案

命名 let 背后的基本思想是它允许您创建一个内部函数,该函数可以调用自身并自动调用它。所以你的代码相当于:

(define (number->list n)
(define (loop n acc)
(if (< n 10)
(cons n acc)
(loop (quotient n 10)
(cons (remainder n 10) acc))))
(loop n '()))

希望这对您来说更容易阅读和理解。

那么你可能会问为什么人们倾向于使用命名 let而不是定义一个内部函数并调用它。这与人们使用(未命名)的理由相同 let :它将两步过程(定义一个函数并调用它)变成一个单一的、方便的形式。

之所以称为循环,是因为该函数在尾部位置调用自身。这被称为 tail recursion .使用尾递归,递归调用直接返回给调用者,因此无需保留当前调用帧。您可以根据需要多次执行尾递归而不会导致堆栈溢出。这样,它就像一个循环一样工作。

如果您想了解有关命名 let 的更多信息以及它是如何工作的, I wrote a blog post about it . (不过,你不需要阅读它来理解这个答案。如果你很好奇,它就在那里。)

关于scheme - 循环形式的命名 let 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909121/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com