不会减少给定的值

时间:2016-05-22 19:35:29

标签: lisp common-lisp

我正在尝试按照照片enter image description here

中附带的问题显示结果

我得到的结果与我想要的结果完全相反

enter image description here

请帮我确定问题

以下是@ scott回复后的更正

(defun decrementing (num)
         (if( = 1 num) 
                 (princ "the number has reach 1. goodbye.")
             (if ( = (- num 1) 10)
             (format t "~&") 
           (format t "the next number is ~d. ~&" (- num 1)
              ))) (decrementing (- num 1)))

我得到了解决方案,但循环永远不会结束

2 个答案:

答案 0 :(得分:1)

你将函数的递归部分放在里面调用public class ImageMatrixGUI extends Observable { private static final ImageMatrixGUI INSTANCE = new ImageMatrixGUI(); private final String IMAGE_DIR = "images"; private final int SQUARE_SIZE; private final int N_SQUARES_WIDTH; private final int N_SQUARES_HEIGHT; private JFrame frame; private JPanel panel; private JPanel info; private Map<String, ImageIcon> imageDB = new HashMap<String, ImageIcon>(); private List<ImageTile> images = new ArrayList<ImageTile>(); private List<ImageTile> statusImages = new ArrayList<ImageTile>(); private int lastKeyPressed; private boolean keyPressed; private ImageMatrixGUI() { SQUARE_SIZE = 48; N_SQUARES_WIDTH = 10; N_SQUARES_HEIGHT = 10; init(); } public static ImageMatrixGUI getInstance() { return INSTANCE; } public void setName(final String name) { frame.setTitle(name); } private void init() { frame = new JFrame(); panel = new RogueWindow(); info = new InfoWindow(); panel.setPreferredSize(new Dimension(N_SQUARES_WIDTH * SQUARE_SIZE, N_SQUARES_HEIGHT * SQUARE_SIZE)); info.setPreferredSize(new Dimension(N_SQUARES_WIDTH * SQUARE_SIZE, SQUARE_SIZE)); info.setBackground(Color.BLACK); frame.add(panel); frame.add(info, BorderLayout.NORTH); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initImages(); new KeyWatcher().start(); frame.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { lastKeyPressed = e.getKeyCode(); keyPressed = true; releaseObserver(); } }); } synchronized void releaseObserver() { notify(); } synchronized void waitForKey() throws InterruptedException { while (!keyPressed) { wait(); } setChanged(); notifyObservers(lastKeyPressed); keyPressed = false; } private void initImages() { File dir = new File(IMAGE_DIR); for (File f : dir.listFiles()) { assert (f.getName().lastIndexOf('.') != -1); imageDB.put(f.getName().substring(0, f.getName().lastIndexOf('.')), new ImageIcon(IMAGE_DIR + "/" + f.getName())); } } public void go() { frame.setVisible(true); } public void newImages(final List<ImageTile> newImages) { synchronized (images) { // Added 16-Mar-2016 if (newImages == null) return; if (newImages.size() == 0) return; for (ImageTile i : newImages) { if (!imageDB.containsKey(i.getName())) { throw new IllegalArgumentException("No such image in DB " + i.getName()); } } images.addAll(newImages); } } public void removeImage(final ImageTile image) { synchronized (images) { images.remove(image); } } public void addImage(final ImageTile image) { synchronized (images) { images.add(image); } } public void clearImages() { synchronized (images) { images.clear(); } public void newStatusImages(final List<ImageTile> newImages) { synchronized (statusImages) { if (newImages == null) return; if (newImages.size() == 0) return; for (ImageTile i : newImages) { if (!imageDB.containsKey(i.getName())) { throw new IllegalArgumentException("No such image in DB " + i.getName()); } } statusImages.addAll(newImages); } } public void removeStatusImage(final ImageTile image) { synchronized (statusImages) { statusImages.remove(image); } public void addStatusImage(final ImageTile image) { synchronized (statusImages) { statusImages.add(image); } } public void clearStatus() { synchronized (statusImages) { statusImages.clear(); } } @SuppressWarnings("serial") private class RogueWindow extends JPanel { @Override public void paintComponent(Graphics g) { // System.out.println("Thread " + Thread.currentThread() + " // repainting"); synchronized (images) { for (ImageTile i : images) { g.drawImage(imageDB.get(i.getName()).getImage(), i.getPosition().getX() * SQUARE_SIZE, i.getPosition().getY() * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE, frame); } } } } @SuppressWarnings("serial") private class InfoWindow extends JPanel { @Override public void paintComponent(Graphics g) { synchronized (statusImages) { for (ImageTile i : statusImages) g.drawImage(imageDB.get(i.getName()).getImage(), i.getPosition().getX() * SQUARE_SIZE, 0, SQUARE_SIZE, SQUARE_SIZE, frame); } } } private class KeyWatcher extends Thread { public void run() { try { while (true) waitForKey(); } catch (InterruptedException e) { } } } public void update() { frame.repaint(); } public void dispose() { images.clear(); statusImages.clear(); imageDB.clear(); frame.dispose(); } public Dimension getGridDimension() { return new Dimension(N_SQUARES_WIDTH, N_SQUARES_HEIGHT); } } ,这样在递归完成后 之后它才真正打印出来(因为在format本身可以进行打印之前,必须评估format的所有参数。

答案 1 :(得分:0)

(defun decrementing (num)
         (if( = 1 num) 
                 (princ "the number has reach 1. goodbye.")
             (if ( = (- num 1) 0)
             (format t "~&") 
           (format t "the next number is ~d. ~&" (- num 1)
              ))) (if (> num 1)(decrementing (- num 1))))

我设法解决了这个问题,非常感谢你的帮助