试图在方案中创建递归函数?

时间:2016-05-01 20:44:35

标签: recursion scheme

我在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)))))

2 个答案:

答案 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必须评估一个过程。一些例外情况是您需要了解的特殊表格,例如conddefine,而不是通过添加括号来了解更改程序含义非常重要。

您的程序的正确定义可能是:

(define (foo x)
  (if (zero? x)
      0
      (+ (expt x (- x 1))
         (foo (- x 1)))))

(foo 5) ; ==> 701

此处我已将cond更改为if,因为未使用cond个功能。看cond我期待副作用或多个谓词。