繁体   English   中英

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

[英]Why does this result in an infinite loop [SICP]?

我正在解决 SICP 的一个问题。 我不确定为什么这个 function 会导致无限循环。 有人可以对此有所了解吗? 我确信可能有更好的方法来编写这个循环,但我是函数式编程的新手,并且仍然试图围绕编写这样的循环。

(define (search-for-primes a b)
        (if (> a b) (display " Done"))
        ((timed-prime-test a) (search-for-primes (+ a 1) b)))

该程序一直为这个输入打印“完成”:(search-for-primes 2 10),这是没有意义的。 'timed-prime-test' 是一个 function,它检查输入是否是素数。 或不。 这就是我的想法:程序一直调用自己,直到 a = 11,此时它会退出。 然而,即使对于前 9 次迭代(a=2 到 a=10),我也没有看到来自“定时-prime-test”function 的 output,这表明控制甚至没有到达第二行,但是如何function 调用是无限次发生的吗?

编辑:我再次查看书中“if”的语法,我注意到两件事:a)“替代”是我的代码在 if 块之外,这是错误的。 我解决了这个问题,但程序 output 用于 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)))

所以, (search-for-primes 1 1)

  • 测试 1 是否大于 1……不是;
  • 然后开始评估((timed-prime-test a) (search-for-primes (+ a 1) b)) ,这样做:
    • 以某种顺序评估(timed-prime-test 1)(search-for-primes 2 1) ,这至少意味着评估(search-for-primes 1 1) ,其中:
      • 测试 2 是否大于 1... 它是
        • 所以它打印“完成”;
      • 然后开始评估……哎呀。

现在应该很明显问题出在哪里了。

((timed-prime-test a) (search-for-primes (+ a 1) b))

(search-for-primes (+ a 1) b)的递归调用的当前延续是((timed-prime-test a) _)但它永远不会到达_因为你永远不会填充它的值,即_bottom type 所以((timed-prime-test a) _)的值也是一个底部。

但是search-for-primes的值是((timed-prime-test a) _)的值。 所以它没有价值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM