明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 423|回复: 8

[提问] 请问这段代码有什么问题,最终结果输入是nil

[复制链接]
发表于 2024-9-7 22:06:41 | 显示全部楼层 |阅读模式
  1. (defun stair-level-steps (step-num / stair-level remainder stair-level-steps new-remainder j stair-level-list stair-level-steps new-stair-level-list temp)
  2.   (setq stair-level     (fix (/ step-num 18))      ;; 计算 step-num 除以 18 的商,存储在 b
  3.   remainder     (rem step-num 18 )      ;; 计算 n 减去 n 除以 18 的商乘以 18 的结果,存储在 remainder
  4.    stair-level-steps   nil                    ;; 创建一个空列表 result-list  
  5.   )                             
  6.   (if (zerop remainder)
  7.       (repeat (fix stair-level)
  8.          (setq result-list (append  result-list (list 18)))
  9.         )
  10.        (progn
  11.    (setq stair-level-steps   (fix (/ step-num (+ stair-level 1)))
  12.     new-remainder    (fix (- step-num (* (+ stair-level 1) stair-level-steps)))
  13.           j       0
  14.            stair-level-list   nil
  15.            new-stair-level-list  nil
  16.           temp      nil
  17.          
  18.    )
  19.    (repeat (fix (+ 1 stair-level))
  20.           (setq stair-level-list (append  stair-level-list (list stair-level-steps)))
  21.         )
  22.   (while (> new-remainder 0)
  23.      (repeat new-remainder
  24.       (setq temp                (nth j stair-level-list)
  25.                              temp                (+ 1 temp)
  26.                   new-stair-level-list   (append new-stair-level-list (list temp))
  27.             j        (1+ j)
  28.           )
  29.        )
  30.     (reverse new-stair-level-list)  
  31.     )
  32.      
  33.   )   
  34.    )
  35. )


  36. (defun c:tt()
  37.   (stair-level-steps (getreal "\n 请输入级数"))
  38. )
各路大神,请问这段代码有什么问题,为啥输入的结果是nil
 楼主| 发表于 2024-9-8 10:05:48 | 显示全部楼层
  1. (defun stair-steps (step-num / stair-level remainder stair-level-steps new-remainder j stair-level-list stair-level-steps temp new-stair-level-list)
  2.   (setq stair-level                 (fix (/ step-num 18))            ;; 计算 step-num 除以 18 的商,存储在 b
  3.         remainder                 (rem step-num 18 )                  ;; 计算 n 减去 n 除以 18 的商乘以 18 的结果,存储在 remainder
  4.         stair-level-steps         nil                                ;; 创建一个空列表 result-list
  5.         new-stair-level-list    nil
  6.   )                             
  7.   (if (zerop remainder)
  8.             (repeat (fix stair-level)
  9.                      (setq stair-level-steps (append  stair-level-steps (list 18)))
  10.               )
  11.        (progn
  12.          (setq stair-level-steps         (fix (/ step-num (+ stair-level 1)))
  13.                 new-remainder                (fix (- step-num (* (+ stair-level 1) stair-level-steps)))
  14.                 j                         0
  15.                        stair-level-list         nil
  16.                 temp                        nil
  17.                 temp2                        nil
  18.          )
  19.          (if  (zerop new-remainder)
  20.                    (repeat (fix (+ 1 stair-level))
  21.                       (setq stair-level-list (append  stair-level-list (list stair-level-steps)))
  22.                       )
  23.                   (progn
  24.                             (repeat (fix (+ 1 stair-level))
  25.                               (setq stair-level-list (append  stair-level-list (list stair-level-steps)))
  26.                               )
  27.                             (repeat new-remainder
  28.                                 (setq         temp                            (nth j stair-level-list)
  29.                                                          temp                            (+ 1 temp)
  30.                                                     stair-level-list                 (append stair-level-list (list temp))
  31.                                               j                                (1+ j)
  32.                                 )
  33.                              )
  34.                              (setq        stair-level-list-length         (length stair-level-list)
  35.                                 i                                   (- stair-level-list-length (+ 1 stair-level))
  36.                              )
  37.                              (repeat         (+ stair-level 1)
  38.                                     (setq       
  39.                                               temp2                        (nth i stair-level-list)
  40.                                               new-stair-level-list        (append new-stair-level-list (list temp2))
  41.                                               i                                (1+ i)
  42.                                      )
  43.                              )
  44.                           (reverse new-stair-level-list)               
  45.                 )
  46.         )
  47.    )
  48.   )
  49. )
用了最笨的办法解决了有没有帮忙优化的,或者提供个思路
发表于 2024-9-8 16:25:22 | 显示全部楼层
  1. (defun c:tt ()
  2.   (defun stair (int / a aa bb lst n nn)
  3.     (setq int (if (/= int (fix int))
  4.                 (1+ (fix int))
  5.                 (fix int)
  6.               )
  7.           aa  (fix (/ int 18)) ; 最多18步
  8.           bb  (rem int 18) ; 余数
  9.     )
  10.     (if (= bb 0)
  11.       (repeat aa (setq lst (cons 18 lst)))
  12.       (progn
  13.         (setq nn (1+ aa)
  14.               n  (/ int nn 1.)
  15.               n  (if (/= n (fix n))
  16.                    (1+ (fix n))
  17.                    (fix n)
  18.                  )
  19.         )
  20.         (while (> int n)
  21.           (setq lst (cons n lst)
  22.                 int (- int n)
  23.                 nn  (1- nn)
  24.                 a   (/ int nn 1.)
  25.           )
  26.           (if (= a (fix a))
  27.             (repeat nn
  28.               (setq lst (cons (fix a) lst)
  29.                     int (- int (fix a))
  30.               )
  31.             )
  32.           )
  33.         )
  34.         (reverse lst)
  35.       )
  36.     )
  37.   )
  38.   (stair (getint "\n请输入级数: "))
  39. )
 楼主| 发表于 2024-9-9 13:10:24 | 显示全部楼层
发表于 2024-9-9 14:43:17 | 显示全部楼层
本帖最后由 lijiao 于 2024-9-9 15:08 编辑

给你简化了一下
  1. (defun stair-steps (step-num / AVE LST M REMAINDER STAIR-LEVEL X)
  2.   (setq step-num (fix step-num)
  3.   stair-level (if (> (rem step-num 18) 0)
  4.           (1+ (/ step-num  18))
  5.           (/ step-num  18)
  6.           )
  7.   )
  8.   (setq ave (fix (/ step-num stair-level))
  9.   m (- step-num (* ave stair-level)))
  10.   (mapcar '(lambda(x)
  11.        (repeat (car x)
  12.          (setq lst (cons (cadr x) lst))
  13.          )
  14.        )
  15.     (list (list (- stair-level m) ave) (list m (1+ ave)))
  16.     )
  17.   lst
  18. )

评分

参与人数 1明经币 +2 收起 理由
xyp1964 + 2 赞一个!

查看全部评分

 楼主| 发表于 2024-9-9 15:24:28 | 显示全部楼层
lijiao 发表于 2024-9-9 14:43
给你简化了一下

非常感谢,昨天也重新写了一个
  1. (defun  tt (stair-steps / len bottom top remainder results)
  2.         (setq stair-levels (ceiling (/ stair-steps 18)))
  3.           (setq min-stair-levels (fix (/ stair-steps stair-levels)))
  4.         (setq max-stair-leves (+ min-stair-levels 1))
  5.           (setq remainder (rem stair-steps min-stair-levels))
  6.         (setq stair-steps-list nil)
  7.           (repeat stair-levels
  8.                     (if (>= (+ remainder (length stair-steps-list)) stair-levels)
  9.                               (setq stair-steps-list (append stair-steps-list (list max-stair-leves)))
  10.                               (setq stair-steps-list (append stair-steps-list (list min-stair-levels)))
  11.                     )
  12.           )
  13.   (reverse stair-steps-list)
  14.   )
  15. (defun ceiling (x)
  16.   (if (= x (fix x))
  17.     (fix x)
  18.     (+ 1 (fix x))
  19.   )
  20. )
发表于 2024-9-9 19:28:43 | 显示全部楼层
天之如一 发表于 2024-9-9 15:24
非常感谢,昨天也重新写了一个

(tt 55) → (19 18 18)
明显错误
发表于 2024-9-9 22:25:21 | 显示全部楼层
  1. (defun stair-steps (int / av lst m nn x)
  2.   ;; (stair-steps 59) → (15 15 15 14)
  3.   ;; (stair-steps 60) → (15 15 15 15)
  4.   (setq int (fix int)
  5.         nn  (/ int 18)
  6.         nn  (if (> (rem int 18) 0)(1+ nn)nn)
  7.         av  (fix (/ int nn))
  8.         m   (- int (* av nn))
  9.   )
  10.   (repeat (- nn m) (setq lst (cons av lst)))
  11.   (repeat m (setq lst (cons (1+ av) lst)))
  12.   lst
  13. )
发表于 2024-9-10 08:42:09 | 显示全部楼层
这个帖子很有意思,它的实质是一个鸡兔同笼问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-22 19:56 , Processed in 0.186737 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表