洛谷 P1009 题解

今天,我终于吧递归给学会了!![faceclap]

def fact(x):#定义乘阶函数
    if x == 1:#特判
        return 1;
    else:
        return x * fact(x - 1)#调用自己
Sum = 0
for i in range(1, int(input()) + 1):#我不友善,真的!
    Sum += fact(i)
print(Sum)输出

来,讲解一下这整个代码的套路:

从样例入手:

输入 3 3 3


f o r for for 1 1 1 开始:

1 1 1 返回 1 1 1 1 = 1 1 = 1 1=1


f o r for for 循环到 2 2 2

2 2 2 开始:

2 2 2 返回 2 2 2 ∗ * ( 2 − 1 ) ( 即 x − 1 ) (2 - 1)(即x - 1) 21(x1)

2 − 1 = 1 2 - 1 = 1 21=1

1 1 1 返回 1 1 1 2 ∗ 1 = 2 2 * 1 = 2 21=2


f o r for for 循环到 3 3 3

3 3 3 返回 3 3 3 ∗ * ( 3 − 1 ) ( 即 x − 1 ) (3 - 1)(即x - 1) 31(x1)

3 − 1 = 2 3 - 1 = 2 31=2

2 2 2 返回 2 2 2 ∗ * ( 2 − 1 ) ( 即 x − 1 ) (2 - 1)(即x - 1) 21(x1)

2 − 1 = 1 2 - 1 = 1 21=1

1 1 1 返回 1 1 1 3 ∗ 2 ∗ 1 = 6 3 * 2 * 1 = 6 321=6

样例答案:

1 + 2 + 6 = 9 1 + 2 + 6 = 9 1+2+6=9

你看得可能会有点晕。

我给你再简洁一点:

def coutdown(x):
	print(x)
	coutdown(x - 1)

调用这个代码,你会发现他停不下来,然后关机吧 C t r l + C Ctrl + C Ctrl+C就可以停下来

这就是递归:递归就是调用自己的函数

它的作用和循环差不多,但递归有基线条件(退出递归)和递归条件(继续递归),在这点上我认为递归比循环好用,但递归会调用栈,栈会越用越多,运气的话—>蓝屏警告,在这点上循环不会占用更多的空间。

你可能感兴趣的:(洛谷)