Haskell中的交叉和运算

时间:2018-04-27 10:02:13

标签: haskell math recursion

我需要确定一个递归函数crosssum :: Int - >在Haskell中Int来计算正数的交叉和。除了(:),(>),(++),(<),(> =),(< =),div,mod,not之外,我不允许使用分层库中的任何函数。 &&),max,min等。

crosssum :: Int -> Int 
cross sum x = if x > 0 
          then x `mod` 10 
          + x `div` 10 + crosssum x 
          else 0 

所以每当我填写例如crosssum 12它说'线程被杀'。我不明白如何做到这一点。我很感激任何想法。谢谢

2 个答案:

答案 0 :(得分:0)

您的代码存在的一个问题是xcrosssum的递归调用作为参数传递时不会减少(或以某种方式更改)。这就是为什么你的程序永远不会停止的原因。

修改后的代码:

crosssum :: Int -> Int
crosssum x = if x > 0
             then x `mod` 10 + crosssum (x `div` 10)
             else 0

将具有以下逻辑

crosssum 12 = 2 + (crosssum 1) = 2 + (1 + (crosssum 0)) = 2 + 1 + 0

顺便说一句,Haskell将通过使用模式匹配来帮助您避免if条件,以获得更易读的代码:

crosssum :: Int -> Int
crosssum 0 = 0
crosssum x =
  (mod x 10) + (crosssum (div x 10))

答案 1 :(得分:0)

Prelude中的divMod也非常方便。这是var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); var view = {x: 0, y: 0}; var questionsArray = []; var moveCount = 0; var mapArray = [ [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 0], [0, 0, 1, 1, 1, 0, 0, 2, 0, 0], [0, 0, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 0], [0, 0, 1, 1, 1, 0, 0, 2, 0, 0], [0, 0, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ]; function isPositionWall(ptX, ptY) { var gridX = Math.floor(ptX / 36) var gridY = Math.floor(ptY / 36) if(gridX < 0 || gridX >= mapArray[0].length) return true; if(gridY < 0 || gridY >= mapArray.length) return true; return mapArray[gridX][gridY]; } var theArray = []; var Question = function(question, answer1, answer2, correctAnswer) { this.question = question; this.answer1 = answer1; this.answer2 = answer2; this.correctAnswer = correctAnswer; this.addToArray = function(){ theArray.push(this); }; this.addToArray(); } Question.prototype.checkAnswer = function() { return answer1 || answer2 == correctAnswer; } var question1 = new Question("Taip ar ne?", "Taip", "Ne", "Taip"); var question2 = new Question("Jo ar ne?", "Ne", "Jo", "Jo"); var question3 = new Question("Aha ar ne?", "Aha", "Ne", "Ne"); var question4 = new Question("Ja ar ne?", "Taip", "Ne", "Taip"); var question5 = new Question("Jojo ar ne?", "Taip", "Ne", "Taip"); var question6 = new Question("Taip ar ne?", "Taip", "Ne", "Taip"); var question7 = new Question("Taip ar ne?", "Taip", "Ne", "Taip"); var StyleSheet = function(image, width, height, x, y) { this.image = image; this.width = width; this.height = height; this.x = x; this.y = y this.draw = function(image, sx, sy, swidth, sheight, x, y, width, height) { context.drawImage(image, sx, sy, swidth, sheight, x, y, width, height); }; this.drawimage = function(image, x, y, width, height) { context.drawImage(image, x, y, width, height); }; }; /* Initial Sprite Position */ var boatPosX = canvas.height/2 - 50; var boatPosY = canvas.height/2 - 50; function render(viewport) { context.save(); context.translate(view.x, view.y); requestAnimationFrame(render); var oldPosX = boatPosX; var oldPosY = boatPosY; for (let i = 0; i < mapArray.length; i++) { for (let j = 0; j < mapArray[i].length; j++) { if (mapArray[i][j] == 0) { this.sprite.draw( background, 190, 230, 26, 26, i * this.sprite.width, j * this.sprite.height, this.sprite.width, this.sprite.height ); } if (mapArray[i][j] == 1) { this.sprite.draw( background, 30, 30, 26, 26, i * this.sprite.width, j * this.sprite.height, this.sprite.width, this.sprite.height ); } if (mapArray[i][j] == 2) { this.sprite.draw( background, 200, 20, 26, 26, i * this.sprite.width, j * this.sprite.height, this.sprite.width, this.sprite.height ); } } } this.ship.drawimage(boat, boatPosX, boatPosY, 50, 50); //console.log(boatPosX + ship.width) if(isPositionWall(boatPosX, boatPosY)) { boatPosX = oldPosY; console.log("collision"); } context.restore(); }; function move(e) { if (e.keyCode == 39) { boatPosX += 5; //canvas.width += 2; view.x -= 5 moveCount++; console.log(moveCount); console.log("right"); context.fillStyle = "red"; context.fillText(theArray[0].question, 0, 0); console.log(theArray[0].question); } if (e.keyCode == 37) { boatPosX -= 5; view.x += 5 moveCount++; console.log(moveCount); console.log("left"); } if (e.keyCode == 38) { boatPosY -= 5; view.Y += 5 moveCount++; console.log(moveCount); console.log("up"); } if (e.keyCode == 40) { boatPosY += 5; view.Y += 5 moveCount++; console.log(moveCount); console.log("down"); } } document.onkeydown = move; var background = new Image(); background.src = "ground.png"; var sprite = new StyleSheet(background, 36, 36, 16, 16); var boat = new Image(); boat.src = "ship.png"; var ship = new StyleSheet(boat, 90, 100, 16, 16); console.log(Math.floor(boatPosX / 36)); console.log(mapArray[Math.floor(boatPosX / 36)]); render(); div的一项操作,事实上对于所有2位数字mod

dm n = sum.sequence [fst,snd] $ divMod n 10

cs将执行任何大小编号。