这个递归函数,已经执行到return了,为什么又去执行递归函数了?

时间:2022-01-09 10:28:19
 
string def = null;
                    string ghi = SearchForTopParentDepartment(dep, def);

private String SearchForTopParentDepartment(Department departmentName, String abc)
        {

            if (departmentName.ParentDepartment != null)
            {
                abc = departmentName.ParentDepartment.DepartmentName;
                SearchForTopParentDepartment(departmentName.ParentDepartment, abc);
               // return abc;
            }
            else
            {
               abc = departmentName.DepartmentName;
              //  return abc;
            }

           return abc;
        }

上面的这段代码,调试时我发现,程序已经执行到return abc 了,为什么又返回去执行if块中的
SearchForTopParentDepartment(departmentName.ParentDepartment, abc);了呢?

11 个解决方案

#1


你不再  调试时  运行 还会return吗??

#2


在你的方法体力声明一个 string 变量,return  出你这个变量。

#3


引用 2 楼 duanzi_peng 的回复:
在你的方法体力声明一个 string 变量,return  出你这个变量。


我试了,还是不行。程序一执行到最后的括弧,就返回返回去执行if块中的
SearchForTopParentDepartment(departmentName.ParentDepartment, abc);

也返回值,但是不是我要的值。return abc;的值是我要的。

#4


return之后当然还要继续执行递归啊!你最里面一层的方法return了,不就回到调用它的上一层了,然后再一层一层这样递归回去直到最开始调用的方法return才结束递归啊。。。。

楼主你最好单步追踪一个层次不太深的递归,好好把递归的执行顺序学习一下,你这里的理解明显有问题啊

#5


引用 4 楼 wtmanutd 的回复:
return之后当然还要继续执行递归啊!你最里面一层的方法return了,不就回到调用它的上一层了,然后再一层一层这样递归回去直到最开始调用的方法return才结束递归啊。。。。

楼主你最好单步追踪一个层次不太深的递归,好好把递归的执行顺序学习一下,你这里的理解明显有问题啊

那么请问,在return后,如何中断这个递归函数啊?

#6


这就是递归的特点,一层层调用,然后一层层往上返,如果调用不正常,过多,会造成 栈溢出。

#7


引用 6 楼 tanta 的回复:
这就是递归的特点,一层层调用,然后一层层往上返,如果调用不正常,过多,会造成 栈溢出。


实在是不知道怎么做,我一return,就调用递归函数。
哪位能写一下我的需求,我学习一下。
我的需求是找到一个部门的*的部门。比如,a的上级是b,b的上级是c.c没有上级了。

下面的函数是我写的,有错误。函数的第一个参数是部门的名字,比如是部门a, 第二个参数abc是函数要返回的值,在我的例子中也就是部门a的*的部门,部门c。再比如函数的第一个参数如果是部门c,那么就执行if块内的代码,由于c没有上级部门,就直接返回c的名字。
请问诸位应该怎么写?请教了。
 private String SearchForTopParentDepartment(Department departmentName, String abc)
        {
            // string i = null;
            if (departmentName.ParentDepartment == null)
            {
               return departmentName.DepartmentName ;
            }
           else
           {
               abc = departmentName.ParentDepartment.DepartmentName;

               SearchForTopParentDepartment(departmentName.ParentDepartment, abc);
              
               // if

           }

#8


你这个最好不用递归,用循环就可以了。
比如,类这样定义
class Department
{
    string name;
    Department parentDepartment;
}
在判断的地方:
Department tDepart=你的Department;
while(null!=tDepart)
{
    tDepart=tDepart,parentDepartment;
}
// 到此,就找到了最高层的了

====================================
还可以采用栈的方式,直接找栈顶就可以了。

建议学学算法语言、数据结构、软件工程等,不一定要都懂,但要有个概念。软件不仅仅是编码这么简单,啰嗦甚多,仅供参考。

#9


关于LZ 的代码,有以下几点要说的,觉得对的可以参考,不对的略过就可以了
1. 代码中无论什么情况下 abc 都会被重新赋值,其实是一个临时变量的用法,没必要作为参数传入
2. SearchForTopParentDepartment 是返回最高部门,那么 Line 10 中调用函数返回的结果到哪里去了呢?
3. String, string 最好统一一下吧

private string SearchForTopParentDepartment(Department departmentName)
{
    if (departmentName.ParentDepartment != null)
    {
        return SearchForTopParentDepartment(departmentName.ParentDepartment);
    }
    else
    {
        return departmentName.DepartmentName;
    }
}

#10


引用 8 楼 tanta 的回复:
你这个最好不用递归,用循环就可以了。
比如,类这样定义
class Department
{
    string name;
    Department parentDepartment;
}
在判断的地方:
Department tDepart=你的Department;
while(null!=tDepart)
{
    tDepart=tDepart,parentDepartment;
}
// 到此,就找到了最高层的了

====================================
还可以采用栈的方式,直接找栈顶就可以了。

建议学学算法语言、数据结构、软件工程等,不一定要都懂,但要有个概念。软件不仅仅是编码这么简单,啰嗦甚多,仅供参考。


久旱逢甘露,他乡遇故知。

#11


引用 9 楼 u013702063 的回复:
关于LZ 的代码,有以下几点要说的,觉得对的可以参考,不对的略过就可以了
1. 代码中无论什么情况下 abc 都会被重新赋值,其实是一个临时变量的用法,没必要作为参数传入
2. SearchForTopParentDepartment 是返回最高部门,那么 Line 10 中调用函数返回的结果到哪里去了呢?
3. String, string 最好统一一下吧

private string SearchForTopParentDepartment(Department departmentName)
{
    if (departmentName.ParentDepartment != null)
    {
        return SearchForTopParentDepartment(departmentName.ParentDepartment);
    }
    else
    {
        return departmentName.DepartmentName;
    }
}

多谢了,十分感谢。

#1


你不再  调试时  运行 还会return吗??

#2


在你的方法体力声明一个 string 变量,return  出你这个变量。

#3


引用 2 楼 duanzi_peng 的回复:
在你的方法体力声明一个 string 变量,return  出你这个变量。


我试了,还是不行。程序一执行到最后的括弧,就返回返回去执行if块中的
SearchForTopParentDepartment(departmentName.ParentDepartment, abc);

也返回值,但是不是我要的值。return abc;的值是我要的。

#4


return之后当然还要继续执行递归啊!你最里面一层的方法return了,不就回到调用它的上一层了,然后再一层一层这样递归回去直到最开始调用的方法return才结束递归啊。。。。

楼主你最好单步追踪一个层次不太深的递归,好好把递归的执行顺序学习一下,你这里的理解明显有问题啊

#5


引用 4 楼 wtmanutd 的回复:
return之后当然还要继续执行递归啊!你最里面一层的方法return了,不就回到调用它的上一层了,然后再一层一层这样递归回去直到最开始调用的方法return才结束递归啊。。。。

楼主你最好单步追踪一个层次不太深的递归,好好把递归的执行顺序学习一下,你这里的理解明显有问题啊

那么请问,在return后,如何中断这个递归函数啊?

#6


这就是递归的特点,一层层调用,然后一层层往上返,如果调用不正常,过多,会造成 栈溢出。

#7


引用 6 楼 tanta 的回复:
这就是递归的特点,一层层调用,然后一层层往上返,如果调用不正常,过多,会造成 栈溢出。


实在是不知道怎么做,我一return,就调用递归函数。
哪位能写一下我的需求,我学习一下。
我的需求是找到一个部门的*的部门。比如,a的上级是b,b的上级是c.c没有上级了。

下面的函数是我写的,有错误。函数的第一个参数是部门的名字,比如是部门a, 第二个参数abc是函数要返回的值,在我的例子中也就是部门a的*的部门,部门c。再比如函数的第一个参数如果是部门c,那么就执行if块内的代码,由于c没有上级部门,就直接返回c的名字。
请问诸位应该怎么写?请教了。
 private String SearchForTopParentDepartment(Department departmentName, String abc)
        {
            // string i = null;
            if (departmentName.ParentDepartment == null)
            {
               return departmentName.DepartmentName ;
            }
           else
           {
               abc = departmentName.ParentDepartment.DepartmentName;

               SearchForTopParentDepartment(departmentName.ParentDepartment, abc);
              
               // if

           }

#8


你这个最好不用递归,用循环就可以了。
比如,类这样定义
class Department
{
    string name;
    Department parentDepartment;
}
在判断的地方:
Department tDepart=你的Department;
while(null!=tDepart)
{
    tDepart=tDepart,parentDepartment;
}
// 到此,就找到了最高层的了

====================================
还可以采用栈的方式,直接找栈顶就可以了。

建议学学算法语言、数据结构、软件工程等,不一定要都懂,但要有个概念。软件不仅仅是编码这么简单,啰嗦甚多,仅供参考。

#9


关于LZ 的代码,有以下几点要说的,觉得对的可以参考,不对的略过就可以了
1. 代码中无论什么情况下 abc 都会被重新赋值,其实是一个临时变量的用法,没必要作为参数传入
2. SearchForTopParentDepartment 是返回最高部门,那么 Line 10 中调用函数返回的结果到哪里去了呢?
3. String, string 最好统一一下吧

private string SearchForTopParentDepartment(Department departmentName)
{
    if (departmentName.ParentDepartment != null)
    {
        return SearchForTopParentDepartment(departmentName.ParentDepartment);
    }
    else
    {
        return departmentName.DepartmentName;
    }
}

#10


引用 8 楼 tanta 的回复:
你这个最好不用递归,用循环就可以了。
比如,类这样定义
class Department
{
    string name;
    Department parentDepartment;
}
在判断的地方:
Department tDepart=你的Department;
while(null!=tDepart)
{
    tDepart=tDepart,parentDepartment;
}
// 到此,就找到了最高层的了

====================================
还可以采用栈的方式,直接找栈顶就可以了。

建议学学算法语言、数据结构、软件工程等,不一定要都懂,但要有个概念。软件不仅仅是编码这么简单,啰嗦甚多,仅供参考。


久旱逢甘露,他乡遇故知。

#11


引用 9 楼 u013702063 的回复:
关于LZ 的代码,有以下几点要说的,觉得对的可以参考,不对的略过就可以了
1. 代码中无论什么情况下 abc 都会被重新赋值,其实是一个临时变量的用法,没必要作为参数传入
2. SearchForTopParentDepartment 是返回最高部门,那么 Line 10 中调用函数返回的结果到哪里去了呢?
3. String, string 最好统一一下吧

private string SearchForTopParentDepartment(Department departmentName)
{
    if (departmentName.ParentDepartment != null)
    {
        return SearchForTopParentDepartment(departmentName.ParentDepartment);
    }
    else
    {
        return departmentName.DepartmentName;
    }
}

多谢了,十分感谢。