递归阶乘 return 语句
Recursive factorial return statement
为什么要用return 1
来终止递归函数呢?是否可以使用任何其他值作为默认值,例如 1.
而且如果我们 return 1 作为函数的 return 值,那么为什么 1 没有 returned 到主函数。
#include<stdio.h>
int fact(int n)
{
if(n>=1)
return (n*fact(n-1));
else
return 1;
}
int main()
{
int a,ans;
scanf("%d",&a);
ans=fact(a);
printf("factorial of %d is %d ",a,ans);
return 0;
}
/*
explanation
fact(4);
if(4>=1) 4*fact(3)
if(3>=1) 4*3*fact(2)
if(2>=1) 4*3*2*fact(1)
if(1>=1) 4*3*2*1*fact(0)
if(0>=1) return 1;
*/
return语句在n==0
时执行。
n==0
的阶乘为 1,所以我们 return 1.
why do we use "return 1" to terminate the recursive function
因为这应该涵盖 n
不是 >=1
的情况,换句话说,当 n
是 0
时。我认为否定 n
无效。 0!
是 1
,因此 returns 这个值。
And if we return 1 as end of function, then why 1 is not returned to
main function.
如果使用 0
或 1
为 n
调用函数,则 1
返回到主函数。对于任何其他值,1
仅在递归阶乘调用中返回,返回给 main
函数的值不是 1
,而是 (n*fact(n-1))
,这是't 1
在那些情况下。
/*
explanation
fact(4);
if(4>=1) 4*fact(3)
if(3>=1) 4*3*fact(2)
if(2>=1) 4*3*2*fact(1)
if(1>=1) 4*3*2*1*fact(0)
if(0>=1) return 1; now return is default tend to multiply as we give 1 and
return has already 24 in its stack so 1*24 is returned to main()
if we give return 2; 2*24 is returned to main();
*/
我们不希望我们的最终结果受到影响,为了解决这个错误,任何乘以 1 的结果都是一样的,所以我们在递归函数中使用 1 作为 return。
其实return也是一个栈寄存器,在函数调用with时存放临时变量,默认乘法属性,我们只能发送一个return始终保持价值。
int fact(int n)
{
if (n >= 1)
return n * fact(n-1);
else
return 1;
}
每次调用 fact()
函数时,它都会运行 return n * fact(n-1);
语句或 return 1;
语句,但不会同时运行两者。
您在 main()
中调用 fact(4)
。它是这样运行的:
main:
compute fact(4)
fact(4):
| 4 >= 1? Yes!
| compute 4 * fact(3)
| fact(3):
| | 3 >= 1? Yes!
| | compute 3 * fact(2)
| | fact(2):
| | | 2 >= 1? Yes!
| | | compute 2 * fact(1)
| | | fact(1):
| | | | 1 >= 1? Yes!
| | | | compute 1 * fact(0)
| | | | fact(0):
| | | | | 0 >= 1? NO!
| | | | | return 1;
| | | | +--> 1
| | | | fact(0) is 1, return 1 * 1 (--> 1)
| | | +--> 1
| | | fact(1) is 1, return 2 * 1 (--> 2)
| | +--> 2
| | fact(2) is 2, return 3 * 2 (--> 6)
| +--> 6
| fact(5) is 6, return 4 * 6 (--> 24)
+--> 24
fact(4) is 24, assign it to `ans`, print it etc
// end of main
当函数使用 return
语句时(或者如果未达到 return
则在执行最后一条语句后,控制权将传递回调用它的表达式。
为什么要用return 1
来终止递归函数呢?是否可以使用任何其他值作为默认值,例如 1.
而且如果我们 return 1 作为函数的 return 值,那么为什么 1 没有 returned 到主函数。
#include<stdio.h>
int fact(int n)
{
if(n>=1)
return (n*fact(n-1));
else
return 1;
}
int main()
{
int a,ans;
scanf("%d",&a);
ans=fact(a);
printf("factorial of %d is %d ",a,ans);
return 0;
}
/*
explanation
fact(4);
if(4>=1) 4*fact(3)
if(3>=1) 4*3*fact(2)
if(2>=1) 4*3*2*fact(1)
if(1>=1) 4*3*2*1*fact(0)
if(0>=1) return 1;
*/
return语句在n==0
时执行。
n==0
的阶乘为 1,所以我们 return 1.
why do we use "return 1" to terminate the recursive function
因为这应该涵盖 n
不是 >=1
的情况,换句话说,当 n
是 0
时。我认为否定 n
无效。 0!
是 1
,因此 returns 这个值。
And if we return 1 as end of function, then why 1 is not returned to main function.
如果使用 0
或 1
为 n
调用函数,则 1
返回到主函数。对于任何其他值,1
仅在递归阶乘调用中返回,返回给 main
函数的值不是 1
,而是 (n*fact(n-1))
,这是't 1
在那些情况下。
/*
explanation
fact(4);
if(4>=1) 4*fact(3)
if(3>=1) 4*3*fact(2)
if(2>=1) 4*3*2*fact(1)
if(1>=1) 4*3*2*1*fact(0)
if(0>=1) return 1; now return is default tend to multiply as we give 1 and
return has already 24 in its stack so 1*24 is returned to main()
if we give return 2; 2*24 is returned to main();
*/
我们不希望我们的最终结果受到影响,为了解决这个错误,任何乘以 1 的结果都是一样的,所以我们在递归函数中使用 1 作为 return。
其实return也是一个栈寄存器,在函数调用with时存放临时变量,默认乘法属性,我们只能发送一个return始终保持价值。
int fact(int n)
{
if (n >= 1)
return n * fact(n-1);
else
return 1;
}
每次调用 fact()
函数时,它都会运行 return n * fact(n-1);
语句或 return 1;
语句,但不会同时运行两者。
您在 main()
中调用 fact(4)
。它是这样运行的:
main:
compute fact(4)
fact(4):
| 4 >= 1? Yes!
| compute 4 * fact(3)
| fact(3):
| | 3 >= 1? Yes!
| | compute 3 * fact(2)
| | fact(2):
| | | 2 >= 1? Yes!
| | | compute 2 * fact(1)
| | | fact(1):
| | | | 1 >= 1? Yes!
| | | | compute 1 * fact(0)
| | | | fact(0):
| | | | | 0 >= 1? NO!
| | | | | return 1;
| | | | +--> 1
| | | | fact(0) is 1, return 1 * 1 (--> 1)
| | | +--> 1
| | | fact(1) is 1, return 2 * 1 (--> 2)
| | +--> 2
| | fact(2) is 2, return 3 * 2 (--> 6)
| +--> 6
| fact(5) is 6, return 4 * 6 (--> 24)
+--> 24
fact(4) is 24, assign it to `ans`, print it etc
// end of main
当函数使用 return
语句时(或者如果未达到 return
则在执行最后一条语句后,控制权将传递回调用它的表达式。