方案中的嵌套函数

Nested functions in scheme

我是方案语言的新手,正在尝试执行这段使用内部函数计算第 n 个斐波那契数列的代码。

出于某种原因,它对我不起作用,我想获得一些帮助。 谢谢。

    (define fibo (lambda (n)
      (define (helperFunction n n1 a_n)
        (begin
        (display a_n)
        (newline)
        (if (> n 1)
        (helperFunction (- n 1) (+ n1 a_n) n1))))
       (helperFunction n 1 1)))

首先,为什么在fibo中使用长版而在helperFunction中使用短版?例如。

(define long-version (lambda (arg) arg))
(define (short-version arg) arg)

这些都是一样的。书籍经常使用长版本来指出函数是值,名称是绑定,就像变量一样,但是当您已经开始使用短版本时,使用短版本是很实用的。

包装函数内容的 begin 是不必要的,因为所有函数都有显式 begin

一个 if 你只有一个测试和一个 then 子句将 return 当测试为假时选择的实现值。我倾向于使用符号 undefined,以免对未定义的值感到意外。

您需要正确缩进代码。我使用 DrRacket 并按 CTRL+I。有了这些,我得到了这样的代码:

(define (fibo n)
  (define (helperFunction n n1 a_n)
    (display a_n)
    (newline)
    (if (> n 1)
        (helperFunction (- n 1) (+ n1 a_n) n1)
        'undefined))
  (helperFunction n 1 1))

所以让我们试试这个:

(fibo 1) ; ==> undefined

看代码就明白了。这几乎不正确,但它按照指示去做。如果是 2 怎么办?

(fibo 2) ; ==
(helperFunction 1 2 1) ==> undefined

我认为你的问题是结果应该是 n1 而不是 undefined。

(define (fibo n)
  (define (helperFunction n n1 a_n)
    (display a_n)
    (newline)
    (if (> n 1)
        (helperFunction (- n 1) (+ n1 a_n) n1)
        n1))
  (helperFunction n 1 1))

关于函数的注释。 standard fibonacci goes like 0,1,1,2,3,5 并且函数通常是零索引的,这样:

(fib 0) ; ==> 0
(fib 1) ; ==> 1
(fib 10) ; ==> 55