我在Scheme中创建递归函数时遇到一些麻烦。我需要创建一个名为foo(x)的函数,递归地添加所有的幂。例如,foo(5)将是5 ^ 4 + 4 ^ 3 + 3 ^ 2 + 2 ^ 1 + 1 ^ 0 = 701。 停止条件是如果x = 0则返回零。否则返回x ^ x-1 + foo(x-1) 以下是我迄今为止的功能:
(define (foo x)
(cond ((zero? x) 0)
(else (+(expt(x (- x 1)))foo(- x 1)))))
答案 0 :(得分:1)
您必须更加小心使用括号,特别注意调用过程的正确方法如下:(foo x)
,而不是:foo(x)
。这应该有效:
(define (foo x)
(cond ((zero? x) 0)
(else (+ (expt x (- x 1))
(foo (- x 1))))))
(foo 5)
=> 701
答案 1 :(得分:0)
请允许我识别代码。我只是将它粘贴在DrRacket中并点击CTRL + I然后将参数+
分别放在一行:
(define (foo x)
(cond ((zero? x) 0)
(else (+ (expt (x (- x 1)))
foo
(- x 1)))))
所以基本情况还可以,但你的默认情况看起来非常糟糕。 x
被视为一个过程,因为它周围有括号,-
也使用x
,就像它是一个数字一样。它不可能两者兼而有之。
foo
未应用,因为周围没有括号所以它评估为过程值,而+
则期望其所有参数都是数字。
Scheme的规则是括号很重要。 x
和(x)
是完全不同的两件事。第一个x
可以是任何值,但(x)
是一个应用程序,因此x
必须评估一个过程。一些例外情况是您需要了解的特殊表格,例如cond
和define
,而不是通过添加括号来了解更改程序含义非常重要。
您的程序的正确定义可能是:
(define (foo x)
(if (zero? x)
0
(+ (expt x (- x 1))
(foo (- x 1)))))
(foo 5) ; ==> 701
此处我已将cond
更改为if
,因为未使用cond
个功能。看cond
我期待副作用或多个谓词。