【问题标题】:How to display fibonacci sequences less than upper bound (CLISP)如何显示小于上限的斐波那契数列(CLISP)
【发布时间】:2021-12-24 12:13:39
【问题描述】:

我正在尝试显示一个小于上限的斐波那契数列,但我无法打印出受该上限约束的序列。

不使用命令式编程原理,声明setf、setq、set等变量,如何解决这个问题?

目前为止

(defun fibonacci (n &optional (a 0) (b 1))
  (if (or (zerop n) (< a n)
      nil)
      (cons a (fibonacci (1- n) b (+ a b)))))

(fibonacci 100) 的预期输出:(0 1 1 2 3 5 8 13 21 34 55 89)。但是,我得到的是(0 1 1 2 3 5 8 13 21 34 55)

【问题讨论】:

    标签: recursion lisp common-lisp fibonacci clisp


    【解决方案1】:

    您无缘无故地降低上限。当您删除 1- 并将一个 ) 移动到正确的位置时,它会按预期工作:

    (defun fibonacci (n &optional (a 0) (b 1))
      (if (or (zerop n) (> a n))
          nil
          (cons a (fibonacci n b (+ a b)))))
    

    测试:

    CL-USER 4 > (fibonacci 10)
    (0 1 1 2 3 5 8)
    
    CL-USER 5 > (fibonacci 100)
    (0 1 1 2 3 5 8 13 21 34 55 89)
    

    【讨论】:

    • 他们有(&lt; a n)。斐波那契数字增长得如此之快,即使存在 1- 错误,它也适用于除少数 n 之外的所有人(显然 :))。
    【解决方案2】:

    你的意思是

    (defun fibonacci (n &optional (a 0) (b 1))
      (if (or (zerop n) (> a n))
          nil
          (cons a (fibonacci n b (+ a b)))))
    

    您遇到了) 展示位置错字/错误,以及翻转测试。此外,n 是上限,而不是 计数。所以没有理由减少它。

    【讨论】:

    • 你是对的。这适用于(斐波那契 100),但我认为测试是错误的。例如,当 fibonacci(10) 应该返回 (0 1 1 2 3 5 8) 时,它会返回 (0 1 1 2 3)
    • 我已经修复了您遇到的另一个错误。 n 是上限,而不是 count。所以没有理由减少它。
    猜你喜欢
    • 2014-05-19
    • 2020-10-18
    • 2015-06-05
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多