如何在Scheme中的列表中追加元素

时间:2017-06-17 02:27:01

标签: scheme

我已经创建了一个程序,通过使用尾递归返回斐波那契数列,我想将其结果添加到列表中。我做了以下事情:

public async Task<GoogleJsonWebSignature.Payload> wfValidateAsync(string pId_Token)
{
    GoogleJsonWebSignature.Payload Sig = await GoogleJsonWebSignature.ValidateAsync(pId_Token, null, false);

    return Sig;
}

我希望appendList返回一个包含斐波纳契系列元素的列表,例如我称之为(fib 8)。 有帮助吗? 感谢

1 个答案:

答案 0 :(得分:1)

在Lisp中编程时,我们避免使用append来构建列表 - 它效率很低,因为在最后插入一个元素,我们必须遍历整个列表......然后再次, 然后再次。最好使用cons以相反的顺序构建列表,并在结尾处反转它。此外,编写尾递归的理想方法是将结果累积到参数中,而不是在外部定义的变量中(无论如何都不会起作用,除非set!价值某处)。这就是我的意思:

(define (fib n)
  (fibTail 1 0 n '()))

(define (fibTail n1 n2 c lst)
  (if (< c 0)
      (reverse lst)
      (fibTail (+ n1 n2) n1 (- c 1) (cons n2 lst))))

例如:

(fib 10)
=> '(0 1 1 2 3 5 8 13 21 34 55)