erlang Elixir程序无输出

5ssjco0h  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(208)

我试图解决一个动态问题,找到我写的代码的子集,但我不知道为什么我没有得到任何东西,它只是 Flink 后运行Todos.sum_of_one(arr_of_digits, sum_val),我认为问题是在终止情况下,当n==0,谁能告诉我哪里是错误的

def Todos do
    #find all the subsets whose sum is equal to sum_val 
    def sumofone(arr_of_digits,n,v,sum)do
      if(sum==0) do
          for i <- v do
            i 
          end
      end
      #return if n becomes 0
      if(n==0) do
        v
      end
      sumofone(arr_of_digits,n-1,v,sum)
      k = Enum.at(arr_of_digits,n-1)
      #inserting the element in the list
      [k | v] 
      sumofone(arr_of_digits,n-1,v,sum - arr_of_digits[n-1]);
    end 

    def sum_of_one(arr_of_digits, sum_val) do
      v = []
      sumofone(arr_of_digits,l,v,sum_val)
    end
  end
ippsafx7

ippsafx71#

这看起来像是你试图从两个if表达式中的函数返回。Elixir不是这样工作的--它总是 * 遍历整个函数,并返回函数中最后一个表达式的值。
解决这个问题的一种方法是将代码分解为不同的函数子句,其中每个子句都与您要测试的条件之一相匹配:

# This clause executes when the fourth argument is 0
    def sumofone(_arr_of_digits,_n,v,0) do
      for i <- v do
        i 
      end
    end

    # This clause executes when the second argument is 0
    def sumofone(_arr_of_digits,0,v,_sum) do
      v
    end

    # This clause executes in all other cases, as long as n is greater than 0
    def sumofone(arr_of_digits,n,v,sum) when n > 0 do
      sumofone(arr_of_digits,n-1,v,sum)
      k = Enum.at(arr_of_digits,n-1)
      #inserting the element in the list
      [k | v] 
      sumofone(arr_of_digits,n-1,v,sum - arr_of_digits[n-1]);
    end

有了这个改变,就保证了函数会真正终止。它仍然不会做你期望它做的事情,因为有两行计算一个值,但把它扔掉了。在Elixir中,如果你想更新一个变量的值,你需要显式地这样做。你的意思是这样的吗?

sum = sumofone(arr_of_digits,n-1,v,sum)

#inserting the element in the list
      v = [k | v]

但我会把它留给您调试。
注意,我在一些参数名前面加了下划线。如果没有下划线,编译器会给予一个警告,提示变量未被使用。如果加了下划线,很明显这是故意的。

相关问题