首页 > 解决方案 > 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))))
    

标签: syntaxscheme

解决方案


我很确定 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!


推荐阅读