Functional programming 为什么这会导致无限循环[SICP]?

Functional programming 为什么这会导致无限循环[SICP]?,functional-programming,scheme,sicp,Functional Programming,Scheme,Sicp,我正在处理SICP的一个问题。我不知道为什么这个函数会导致无限while循环。有人能解释一下吗?我相信可能有更好的方法来编写这个循环,但我对函数式编程还不熟悉,仍然在尝试像这样编写循环 (define (search-for-primes a b) (if (> a b) (display " Done")) ((timed-prime-test a) (search-for-primes (+ a 1) b))) 程序会继续为这个输入

我正在处理SICP的一个问题。我不知道为什么这个函数会导致无限while循环。有人能解释一下吗?我相信可能有更好的方法来编写这个循环,但我对函数式编程还不熟悉,仍然在尝试像这样编写循环

(define (search-for-primes a b)
        (if (> a b) (display " Done"))
        ((timed-prime-test a) (search-for-primes (+ a 1) b)))
程序会继续为这个输入打印“完成”:(搜索素数210),这毫无意义“定时素数测试”是一种检查输入是否为素数的功能。我是这么想的:程序一直在调用自己,直到a=11,这时它就会退出。然而,即使在前9次迭代(a=2到a=10)中,我也没有看到“timed prime test”函数的输出,这向我表明控件甚至没有到达第二行,但是函数调用是如何无限次发生的


编辑:我在书中再次查看了“if”的语法,我注意到两件事:a)“alternative”是我的代码在if块之外,这是错误的。我修正了这个问题,但是程序输出为a=10。b) 一个脚注说它应该只有一个表达式。我的程序的这种行为与b)有关吗?如果是,在这种情况下,程序是如何执行的?

如果正确格式化代码,答案将立即清晰。这就是为什么正确格式化代码很重要的原因。以下是您的定义和更好的格式:

(define (search-for-primes a b)
  (if (> a b)
      (display " Done"))
  ((timed-prime-test a) (search-for-primes (+ a 1) b)))
所以,
(搜索素数11)

  • 测试1是否大于1。。。不是,
  • 然后开始评估
    ((定时素数测试a)(搜索素数(+a1)b))
    ,要执行此操作:
    • 以某种顺序评估
      (定时素数测试1)
      (搜索素数2 1)
      ,这至少意味着评估
      (搜索素数1 1)
      ,这:
      • 测试2是否大于1。。。它是
        • 所以它打印“完成”
      • 然后开始评估。。。哎呀
现在应该很清楚问题出在哪里了

((timed-prime-test a) (search-for-primes (+ a 1) b))
(搜索素数(+a1)b)
的递归调用的当前继续是
((定时素数测试a)
,但它从未到达
,因为您从未填充它的值,即
的值是a。因此,
((定时素数测试a)
的值也是一个底部

但是
搜索素数的值是
((定时素数测试a)
的值。所以它没有价值