gpt4 book ai didi

c# - 递归。并非所有代码路径都返回一个值

转载 作者:太空宇宙 更新时间:2023-11-03 18:14:29 24 4
gpt4 key购买 nike

我确定我在这里犯了一个愚蠢的错误,但它打败了我。这是一段代码:

void Main()
{
//Key is a parent while the list contains its children
Dictionary<string,List<string>> d = new Dictionary<string,List<string>>();
d.Add("1",new List<string>(){"2","3"});//valid.should return false
d.Add("2",new List<string>(){"4"});//valid.should return false
d.Add("3",new List<string>(){"5"});//valid.should return false
d.Add("4",new List<string>(){"1"});//invalid.should return true

IsChildAlreadyAParent("4","2",d);
}

private bool IsChildAlreadyAParent( string child, string parent, Dictionary<string, List<string>> d )
{
if( !d.ContainsKey( child ) || ( d.ContainsKey( child ) && d[child].Count == 0 ))
{
return false;
}

foreach( string childOfChild in d[child] )
{
if( childOfChild == parent )
return true;

if( IsChildAlreadyAParent( childOfChild, parent, d ) ) return true;
}
}

编译这个给我这个错误:

IsChildAlreadyAParent(string, string, System.Collections.Generic.Dictionary<string,System.Collections.Generic.List<string>>)': not all code paths return a value

我已经阅读了几次代码,但我看不出返回条件是如何被遗漏的。我知道我可以通过在方法结束之前添加一个方法返回语句来纠正它,但这并不能帮助我理解手头的问题。差距在哪里??

最佳答案

你可能认为这只执行一次循环体,总是从函数返回:

foreach( string childOfChild in d[child] )
{
if( childOfChild == parent )
return true;

return IsChildAlreadyAParent( childOfChild, parent, d );
}

但是如果 d[child] 根本没有元素呢?

此外,仅测试第一个 child 可能也不是正确的解决方案。

更好:

foreach( string childOfChild in d[child] )
{
if( childOfChild == parent ) return true;
if (IsChildAlreadyAParent( childOfChild, parent, d )) return true;
}
return false;

关于c# - 递归。并非所有代码路径都返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com