syntax - MIT-Scheme SICP Exercise_1.11——对象#t 不适用
问题描述
这是我在 StackOverflow 上的第一篇文章。我一直在研究 SICP 的练习 1.11,并且觉得我有一个可行的解决方案。在从纸质文件转移到 Emacs 时,我似乎遇到了一些我不知道的语法错误。我尽我所能对括号进行双重和三次检查并解决它,但终端仍然给我一个“对象#t不适用”的消息。有人可以为我指出如何修复代码的正确方向,以便我可以正确测试其输出吗?”
练习 1.11:函数 f
由以下规则定义:
f(n)=n 如果 n<3
, 和
f(n)=f(n-1)+2f(n-2)+3f(n-3) 如果 n>=3
编写一个通过递归过程计算 f 的过程。编写一个通过迭代过程计算 f 的过程。
(define (f-recur n)
(if ((< n 3) n)
(+ (f(- n 1))
(* 2 (f(n-2)))
(* 3 (f(n-3)))))
(define (f-iter n)
(define (counter n)
(if (<= n 3) 0)
(- n 3))
(define (d n) (+ n (* 2 n) (* 3 n)))
(define (c n) (+ d (* 2 n) (* 3 n)))
(define (b n) (+ c (* 2 d) (* 3 n)))
(define (a n) (+ b (* 2 c) (* 3 d)))
(define (f a b c d counter)
(if ((> (+ counter 3) n) a)
(f (+ b (* 2 c) (* 3 d)) a b c (+ counter 1)))))
(cond ((= counter 0) d)
((= counter 1) c)
((= counter 2) b)
((= counter 3) a)
(else (f a b c d counter))))
解决方案
我很确定 SICP 正在以这种迭代斐波那契的方式寻找解决方案:
(define (fib n)
(define (helper n a b)
(if (zero? n)
a
(helper (- n 1) b (+ a b))))
(helper n 0 1))
斐波那契是f(n)=f(n−1)+f(n−2)
所以我猜f(n)=f(n−1)+2f(n−2)+3f(n−3)
可以用一个额外的变量以完全相同的方式制作。您的迭代解决方案看起来更像 Fortran 而不是 Scheme。尽量避免set!
。
推荐阅读
- c# - 如何将 ProcessStartInfo 写入 Linux 的文本文件
- php - 学说获得销量最多的产品
- sql - MongoDB超时查询
- algorithm - 删除左倾红黑树及其不变量
- c# - WebRoot 和 ContentRoot 用于更改 ASP.NET Core 应用程序的“Web 部件”位置的目的?
- swift - 带有日期选择器工具栏的 iOS 14 错误
- javascript - 在 Next JS 中访问 JSON 对象中的数据
- ios - 在 SwiftUI `DatePicker` 中点击日期时如何捕获?
- adb - adb exec-out screencap 创建损坏的图像
- python - 为什么'具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all() ' 发生