for+if语句 和 仅用if语句 的程序效率
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for+if语句 和 仅用if语句 的程序效率相关的知识,希望对你有一定的参考价值。
比如我先定义了一维数组以及变量max:
int number[10],int max;
假设number[0]~number[9]已经赋值,
max=number[0];
现欲求出10个数的最大值,可以使用for+if语句:
for (int i=1;i<10;i++)
if(max<number[i])max=number[i];
或者仅使用9个if语句:
if (max<number[1])
max=number[1];
if (max<number[2])
max=number[2];
……(省略)
if (max<number[9])
max=number[9];
请问上述两种方法,哪一种程序效率较高?为什么?
1 程序代码
#include "stdafx.h"
#include <stdio.h>
int main()
int number[10] =1212,1212,1,2,4,5,6,7,8,999999;
int max;
max=number[0];
for(int i=1;i<10;i++)
if(max<number[i])
max=number[i];
if (max<number[1])
max=number[1];
if (max<number[2])
max=number[2];
if (max<number[3])
max=number[3];
if (max<number[4])
max=number[4];
if (max<number[5])
max=number[5];
if (max<number[6])
max=number[6];
if (max<number[7])
max=number[7];
if (max<number[8])
max=number[8];
if (max<number[9])
max=number[9];
return 0;
2 问题提出:
上面程序代码查找10个数中的最大值,分别使用for +if语句,和9个单独的if语句,请问上述两种方法,
哪一种程序效率较高?为什么?
3 分析
3.1 for+if语句的反汇编代码
13: for(int i=1;i<10;i++)
00401074 mov dword ptr [ebp-30h],1
0040107B jmp main+76h (00401086)
0040107D mov ecx,dword ptr [ebp-30h]
00401080 add ecx,1
00401083 mov dword ptr [ebp-30h],ecx
00401086 cmp dword ptr [ebp-30h],0Ah
0040108A jge main+94h (004010a4)
14:
15: if(max<number[i])
0040108C mov edx,dword ptr [ebp-30h]
0040108F mov eax,dword ptr [ebp-2Ch]
00401092 cmp eax,dword ptr [ebp+edx*4-28h]
00401096 jge main+92h (004010a2)
16:
17: max=number[i];
00401098 mov ecx,dword ptr [ebp-30h]
0040109B mov edx,dword ptr [ebp+ecx*4-28h]
0040109F mov dword ptr [ebp-2Ch],edx
18:
19:
004010A2 jmp main+6Dh (0040107d)
3.2 独立的9个if语句的反汇编代码(以第一个if语句为例)
22: if (max<number[1])
004010A4 mov eax,dword ptr [ebp-2Ch]
004010A7 cmp eax,dword ptr [ebp-24h]
004010AA jge main+0A2h (004010b2)
23:
24: max=number[1];
004010AC mov ecx,dword ptr [ebp-24h]
004010AF mov dword ptr [ebp-2Ch],ecx
25:
3.3 分析:
1)使用for + if ,每次循环需要执行13个汇编代码,循环代码最大可能执行:9 * 13 = 117条指令;
2)使用独立if语句,每次执行5条判断语句,9个if代码判断最大执行代码量为9 * 5 = 45 条指令;
程序效率分析(运行时间和占用内存空间的分析)因此从程序时间效率上分析,2)的时间效率会比较高。但从空间
上分析,1)的效率会比较高,循环执行一共使用15条指令;2)的效率不高(45条指令空间)。
实际的编程使用建议 :一般实际使用1)方法的话,代码会比较容易维护,2)在实际应用中显得不是很专业的做法! 参考技术A 两种算法的程序效率应该相当的吧,时间复杂度都为O(10)
纠正一个错误:定义变量
int number[10],int max;
要么把逗号改成分号,要么就把int去掉
希望回答对你有帮助。 参考技术B 用9个if的效率高,但是用for语句比较简洁,易修改。
原因很明显,for循环里同样做了9次比较和赋值,但是还多出了9次对i的赋值和比较操作。
其实不必计较这个的,基本没人会用9个if 参考技术C 这个 最坏情况下都是常量时间 O(1)
所以是一样的
假设有n步
for 循环和if 都是 O(n) 所以 比这个是没意义的
这个for 能循环n次 if你能复制n次吗??? 参考技术D for高,CPU会把for的循环块放进cache再进行运算。如果你的if语句太长甚至都不能整个的放进去。
Python基础语法—— 条件语句(if)+循环语句(for+while)
文章目录
条件语句
if - else
Python中的 if-else 语法格式
if 条件1:
条件1满足执行的语句
elif 条件2:
条件2满足执行的语句
else:
条件1和2都不满足执行的语句
必定执行的语句
注意:Python的条件语句的写法和很多编程语言不太一样
- if 后面的条件表达式没有
()
,使用:
作为结尾 - if/else命中条件后要执行的语句块,使用4个空格或者Tab进行缩进,并没有使用花括号这么一说
- 对于多分支语句,写作 elif
示例
tmp = input("你要好好学习请输入 1,你要天天摆烂请输入 2 ——> ")
if tmp == '1':
print('好好学习你可以找一份好工作')
elif tmp == '2':
print('天天摆烂可能就不好找工作')
else:
print('输入错误')
if嵌套
num1 = int(input('请输入第一个数字:'))
num2 = int(input('请输入第二个数字:'))
if num1 < 10:
if num2 < 10:
print('你输入的是个位数')
else:
print('你输入的不是个位数')
判断闰年
year = int(input('请输入一个年份: '))
if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):
print(f'year是闰年')
else:
print(f'year不是闰年')
空语句 (pass)
有的时候我们希望条件满足的时候啥都不做,但Python对代码的缩进要求比较高,不能啥都不写,也不能写个注释。
错误示例:
age = input('请输入你的年龄')
if age != '18':
#错误示例
else:
print(f'你的年龄为age')
正确做法,加上 pass
关键字
age = input('请输入你的年龄')
if age != '18':
pass
else:
print(f'你的年龄为age')
pass关键字表示空语句,并不会对程序的执行有任何影响,只是占一个位置
循环语句
while 循环
语法格式:
while 条件:
循环体
- 条件为真执行循环体
- 条件为假结束循环
求 1!+2!+3!+n!
num = int(input('请输入一个数,求1!+到这个数的阶乘: '))
result = 0
count = 1
tmp = 1
while num >= count:
result += tmp
count += 1
tmp *= count
print(result)
for循环
基本语法:
for 循环变量 in 可迭代对象
循环体
注意:
- Python的for循环和C/Java语言不同,没有“初始化语句”、“循环条件判定语句”、“循环变量更新语句”,而是变得更加简单
- 所谓的“可迭代对象”,指的是内部包含多个元素,能一个一个把元素取出来的特殊变量
示例:
for i in range(1, 11):
print(i, end=" ")
- range函数,能够生成一个可迭代对象,生成的范围是 [1,11),也就是左闭右开的一个区间
- end是表示每次打印后结尾加什么,默认是加个换行符**\\n**
range函数另一种写法
# 打印 2 4 6 8 10
for i in range(2, 11, 2):
print(i, end=" ")
- range第一个参数为开始数字
- 第二个参数为结束数字
- 第三个参数为步长,类似于 i+=2
同样步长还可以设定为负数
for i in range(10, 0, -1):
print(i, end=" ")
continue&break
continue 表示结束这次循环, 进入下次循环
for i in range(1, 11):
if i % 2 == 0:
continue
print(f'第i天')
break表示直接跳出单前循环
count = 0
result = 0
while True:
tmp = input('请输入多个数字求和,输入;结束: ')
if tmp == ';':
break
tmp = int(tmp)
result += tmp
count += 1
print(f'你一共输入了count个数字,它们的和为result')
循环嵌套
输出九九乘法表
for i in range(1, 10):
for j in range(1, 10):
print(f'i*j=i*j ', end='')
print()
以上是关于for+if语句 和 仅用if语句 的程序效率的主要内容,如果未能解决你的问题,请参考以下文章