【问题标题】:LISP Printing to Same LineLISP 打印到同一行
【发布时间】:2020-10-29 03:43:19
【问题描述】:

另一个 LISP 问题,我目前正在尝试编写一个返回三角形的函数,其大小将取决于用户的输入

例如:7

aaaaaaa 
aaaaaa 
aaaaa 
aaaa 
aaa 
aa 
a 

例如:-3

aaa 
 aa 
  a

我已经编写了正整数部分的代码,至少是逻辑,但我遇到了障碍。我似乎无法让循环在同一行打印字母。每次循环迭代时,它都会转到下一行。有没有什么办法解决这一问题?此外,任何关于我的实施的 cmets/建议将不胜感激,我在 Lisp 非常新。非常感谢大家!你会在下面找到我的代码

(defun triangle (k) 
    (if (or (= k 1) (= k -1))
        (print 'a)) 
        (if (> k 0) 
           (loop for n from 0 to k
                 do (print 'a)) 
                (triangle (- k 1))))

        
(print (triangle 2))

【问题讨论】:

    标签: recursion printing io lisp common-lisp


    【解决方案1】:

    确实,print 打印了一个换行符。 princ 没有。

    为了进一步控制您打印内容的方式,有format。它适用于以~ 开头的指令。因此,~a(或~A)在美学上打印作为参数给出的对象。 ~& 打印一个换行符。

    (format t "~a~&" 'a)
    

    t 用于*standard-output*

    https://lispcookbook.github.io/cl-cookbook/strings.html#structure-of-format

    此链接还解释了如何将字符串向右或向左对齐,这可能是您需要的(如果您采用格式路线)。

    您可以缩短代码。有make-string count :initial-element character 可以替换循环。一个字符写成#\a

    只有当 k > 0 (zerop) 时,您才能递归调用三角形。有了这个和(format t "~a~&" (make-string k :initial-element #\a)),我的版本只有一次调用打印函数,更少的“if”机制:

    (defun my-triangle (k)
       (format t "~a~&" (make-string k :initial-element #\a))
       (unless (zerop k)
         (my-triangle (decf k))))
    

    【讨论】:

    • 您能像您提到的那样分享如何在一行中实现上述调用吗?我不确定如何将该部分放入我的代码中,这只是另一个问题,princ 运行良好,但是我的递归调用似乎无论出于何种原因都不起作用。它要么不跳到下一行,要么在某些输出之间打印一个空格,
    • ex) (print(triangle1)) 输出-> A AA, (print(triangle(2)) 输出-> AAA
    • 好的,我添加了我的 sn-p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2022-01-16
    • 2013-08-27
    相关资源
    最近更新 更多