我如何返回三个变量?

时间:2015-04-27 08:33:23

标签: function loops haskell recursion

我的任务是确定document.getElementsByName('submitButton')[0].onclick = function(event) { } document.getElementById('calcForm').onsubmit = function (event) { event.preventDefault(); var num1 = parseFloat(document.getElementsByName('valueA')[0].value) || 0, num2 = parseFloat(document.getElementsByName('valueB')[0].value) || 0, arithmeticOperator = document.getElementsByName('arithmeticOperator')[0].value, output = document.getElementsByName('result'); switch (arithmeticOperator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': if (num2 != 0) { result = num1 / num2; } else { result = 'Cant devide bu 0'; } break; default: result = 'Error'; } document.getElementsByName('result')[0].innerHTML = result; }; x函数y将返回z的参数。我想迭代从tresorTrue的每个变量的递归,类似于以下命令循环:

0

首先我想检查从0到100的所有100,然后如果x = 100,设置x = 0和y + 1再次x到100,依此类推z ...

但是,我不知道如何单独返回for z = 0 to 100: for y = 0 to 100: for x = 0 to 100: if tresor x y z: return (x,y,z)

这是我的代码:

x

3 个答案:

答案 0 :(得分:3)

一个看起来很像命令循环的实现如下:

crackthe tresor = do         -- function crackthe tresor:
  z <- [0..100]              --   for z = 0 to 100:
  y <- [0..100]              --     for y = 0 to 100:
  x <- [0..100]              --       for x = 0 to 100:
  guard (tresor x y z)       --         if tresor x y z:
  return (x, y, z)           --           return (x,y,z)

这取决于以下事实:do符号列表中<-就像是所有列表元素的循环一样,guard就像break一样条件并不满足。

答案 1 :(得分:2)

您可以使用三个数字而不是一个数字的元组返回三个变量,如:

crack tresor = (5,2,13)

答案 2 :(得分:2)

逐步解决方案:

打开你最喜欢的编辑器并粘贴:

module Tresor where

crack tresor =     
    crackthe tresor 0 0 0

crackthe tresor x y z =    
    if tresor x y z == False
        then if x < 100 
            then crackthe tresor (x+1) (y) (z)
            else if x == 100 && y < 100
                then crackthe tresor (x-100) (y+1) (z)
                else if y == 100 && x == 100 && z < 100
                    then crackthe tresor (x-100) (y-100) (z+1)
                    else (x,y,z)
        else (x,y,z)

这只是您的代码(x,y,z)而不是(x+y+z)

现在将其保存为“tresor.hs”,启动ghci并使用:l tresor.hs加载它,您现在可以执行以下操作:

λ> crack (\ x y z -> 2*x + y - z -5 == 0)
(2,1,0)

您可以看到tresor函数2*x+y-z-5==0,首先找到的解决方案将是(2,1,0),意味着x=2, y=1, z=0有效;)

更简单的方法

是使用@chi

提到的列表推导
crackThe :: (Int -> Int -> Int -> Bool) -> (Int, Int, Int)
crackThe tresor = head [(x, y, z) | z <- [0..100], y <- [0..100], x <- [0..100], tresor x y z]

使用

λ> crackThe (\ x y z -> 2*x + y - z -5 == 0)
(2,1,0)