【python】关于函数递归使用 return 后,收到数据为 None。
在写一个辗转相除求最小公因数的程序的时候,突然发现自己不管怎么写(除了两数恰巧可以整除),return 返回的值恒为 none。
代码为此:
def gcd(a,b):
if a%b==0:
return b
else:
gcd(b,a%b)
总之调试一下,得到的结果是各部分输出正常。
然后用循环做了一遍:
def gcd(a,b):
a=int(a)
b=int(b)
while a%b!=0:
save=a
a=b
b=save%b
return b
输入a=25,b=15,收到的结果是5。结果正确。
于是可以肯定,算法没有问题,但是不服气啊,凭什么递归做不出来,摆着试试的想法,把return换成了print。输出正常。
然后就更加摸不着头脑了,为什么 print 可以,你 return 就不行。
于是开始百度 Return 的用法,调用函数的时候,如果没有执行 return 命令(或 return 命令未接收数据),默认会返回 none 。
翻了一会终于想明白:这样一个递归函数,其实重复调用了多次这个函数,我们来分解一下这些步骤。
首先,第一次调用经过 if 后,第二次调用了该函数,假设此次调用通过 if 即可达到设定好的 return,函数返回计算出的值 X,然而这次 return 相当于是 return 到了第一次调用的gcd(b,a%b)身上,而该行代码上没有 return。假设输入a=25,b=5,数据之所以正常返回,是因为这个过程里只有第一次调用。
想象一套有单独分开的出入口的俄罗斯套娃,这就相当于是在这些套娃上为数据打开了向内的入口,并且只打开了最外部套娃的出口,于是数据便只能入不能出,故此返回的就全是 none 了。
遂将代码改成这样:
def gcd(a,b):
if a%b==0:
return b
else:
return (gcd(b,a%b))
通过在 gcd(b,a%c) [第N次调用函数所得的值,N>=2]上增加输出口解决了这一问题。
【python】关于函数递归使用 return 后,收到数据为 None。的更多相关文章
- python之函数递归
函数递归调用 在函数内部,可以调用其它函数,如果一个函数在内部调用自身,即是递归调用 为防止无限递归类似于死循环,需要如下: 1.必须要有一个明确的返回值: 2.每次进入更深一层递归时,问题规模应该比 ...
- python基础-函数递归
函数递归 概念:直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式. 直接调用:在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo ...
- Python 匿名函数用法和return语句
匿名函数用法1.什么是匿名函数 函数定义过程中,没有给定名称函数,python中用lambda表达式创建匿名函数 lambda只是一个表达式,函数体比def简单 lambda主题是一 ...
- (十七)python 3 函数递归
递归函数 即自己调用自己,递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件 优点:使用递归时,常常可以让代码更加简洁 缺点:递归会占用比较多的内存,当递归次数比较多时,性能 ...
- python 关于函数递归调用自己
爬取b站博人传 每页短评20个,页数超过1000页, 代码如下 import requests import json import csv def main(start_url): headers ...
- python中函数的定义和详细的使用方法
1. 函数的概念,函数是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 2. 函数的作用,使用函数可以加强代码的复用性,提高程序编写的效率 3. 函数的使用,函数必须先创建才 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- python之旅:三元表达式、列表推导式、生成器表达式、函数递归、匿名函数、内置函数
三元表达式 #以下是比较大小,并返回值 def max2(x,y): if x > y: return x else: return y res=max2(10,11) print(res) # ...
- Python之路Python全局变量与局部变量、函数多层嵌套、函数递归
Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...
随机推荐
- Android Studio 使用笔记:文件查询方法总结
搜索单词 Windows: Ctrl + F Mac : Cmd + F 会在当前激活的文件上查询输入的关键字,以高亮显示 跳转行 Windows: Ctrl + L Mac : Cmd + ...
- Java之StringBuffer和StringBuilder的差别与联系
2.StringBuilder,StringBuffer 字符串拼接时用这两个类,效率高.节约内存.假设用字符串 "+"号拼接 性能差.而且浪费空间,产生非常多垃圾 StringB ...
- 第二篇: Ansible 安装
一.配置epel源 wget –O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 二.安装ansible ...
- Python 自动化之验证码识别
之前公司的验证码比较简单,可以采取直接破解的方式进行登录 部分代码如下: # -*- coding: utf-8 -*- from selenium import webdriver from sel ...
- iOS中获取系统相册中的图片
一.获取单张图片 思路: 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片 2.设置代理,遵守代理协议 注意这个UIImagePickerContr ...
- jQuery.callbacks 注释
(function( jQuery ) { // String to Object flags format cache var flagsCache = {}; // Convert String- ...
- 九度OJ 1356:孩子们的游戏(圆圈中最后剩下的数) (约瑟夫环)
时间限制:10 秒 内存限制:32 兆 特殊判题:否 提交:1333 解决:483 题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深 ...
- PHP自定义函数: 下载远程文件
function httpcopy($url, $file="", $timeout=60) { $file = empty($file) ? pathinfo($url,PATH ...
- 【python】-- socketserver
socketserver SocketServer服务端内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求.即:每个客户端请求连接到服务器时,Socket服务端 ...
- opengl绘制图片
#include <GL/glew.h>#include <glut.h>#include "FreeImage.h"#include <stdio. ...