Functional programming 为什么这会导致无限循环[SICP]?
我正在处理SICP的一个问题。我不知道为什么这个函数会导致无限while循环。有人能解释一下吗?我相信可能有更好的方法来编写这个循环,但我对函数式编程还不熟悉,仍然在尝试像这样编写循环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))) 程序会继续为这个输入
(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。。。它是
- 所以它打印“完成”李>
- 然后开始评估。。。哎呀
- 测试2是否大于1。。。它是
- 以某种顺序评估
((timed-prime-test a) (search-for-primes (+ a 1) b))
(搜索素数(+a1)b)
的递归调用的当前继续是((定时素数测试a)
,但它从未到达。
,因为您从未填充它的值,即的值是a。因此,((定时素数测试a)
的值也是一个底部
但是搜索素数的值是((定时素数测试a)
的值。所以它没有价值