我试图解决一个动态问题,找到我写的代码的子集,但我不知道为什么我没有得到任何东西,它只是 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
1条答案
按热度按时间ippsafx71#
这看起来像是你试图从两个
if
表达式中的函数返回。Elixir不是这样工作的--它总是 * 遍历整个函数,并返回函数中最后一个表达式的值。解决这个问题的一种方法是将代码分解为不同的函数子句,其中每个子句都与您要测试的条件之一相匹配:
有了这个改变,就保证了函数会真正终止。它仍然不会做你期望它做的事情,因为有两行计算一个值,但把它扔掉了。在Elixir中,如果你想更新一个变量的值,你需要显式地这样做。你的意思是这样的吗?
和
但我会把它留给您调试。
注意,我在一些参数名前面加了下划线。如果没有下划线,编译器会给予一个警告,提示变量未被使用。如果加了下划线,很明显这是故意的。