所以说,有时候有些人以为自己学的很好了,自己所做的一切都是最好的,这种想法是不正确的,也许有些初学者没有什么经验写出来的代码却更让人容易明白点,那么也是先看看代码:
#include<stdio.h>
voidmain()
{
intday[11];
inti;
day[0]=1;
for(i=1;i<11;i++)
{
day[i]=(day[i-1]+1)*2;
}
printf("%d\n",day[10]);
}
代码不长,而且也恰当的应用了题目中的规律,不是说要吃一半然后再吃一个吗?那我用数组来存放每天苹果的数量,用day[0]表示最后一天的苹果数量,那就是剩下的一个,然后就是找规律了,什么规律?就是如果猴子不多吃一个的话,那就是正好吃了一半,也就是说猴子当天吃了之后剩余的苹果的数目加1个然后再乘以2就是前一天的数目了,这样一想这个题目就简单的多了,于是这个题用数组就轻松的做出来了 。
那么这个代码究竟是不是已经很好了呢,我们注意到,这里边每个数组元素只用了一次并没有被重复使用,再这种情况下我们是不是可以用一种方法代替数组呢?于是就有了更优化的写法,这个写法似乎已经是相当简练了:
#include<stdio.h>
voidmain()
{
intapple=1;
inti;
for(i=0;i<10;i++)
{
apple=(apple+1)*2;
}
printf("%d\n",apple);
}
代码写到这里已经把问题完全抽象化了,所以我们就应该站在数学的角度去分析了 。也许我们就应该结束了讨论,但是偏偏这个时候,又来了递归,悄悄的通过美丽的调用显示了一下她的魅力:
#include<stdio.h>
intapple(inti)
{
if(i==0)
{
return1;
}
else
{
return(apple(i-1)+1)*2;
}
}
voidmain()
{
inti;
i=apple(10);
printf("%d\n",i);
}
原理都还是一样的,但是写出来的格式已经完全变掉了,没有了for循环 。假想一个复杂的问题远比这个问题复杂,而且没有固定循环次数,那么我们再使用循环虽然也能解决问题,但是可能面临循环难以设计、控制等问题,这个时候用递归可能就会让问题变的非常的清晰 。
另外说一点,一般我这里的代码,并不是从最差到最好的,基本排列是从最差到最合适的代码(当然是本人认为最合适的,也许还有更好的,本人能力所限了),然后最后给出一种比较违反常规的代码,一般是不赞成用最后一种代码的,当然有时候最后一种代码也许是最好的选择,看情况吧!
20:25|添加评论|固定链接|引用通告(0)|记录它|计算机与Internet
10月15日
程序算法3-递归1-递归小显威力
现在用C语言实现一个字符串的倒序输出,当然,方法也是很多的,但是如果程序中能有相对优化的方法或者简单明了易读的方法,那对你自己或者别人都是一种幸福 。
第一种写法,这类写法既浪费内存又不实用,一般是刚学程序的才这样做,程序的结构很简单,利用的是数组:
#include<stdio.h>
voidmain()
{
charc[2000];
inti,length=0;
for(i=0;i<2000;i++)
{
scanf("%c",&c[i]);
if(c[i]=='\n')
{
break;
}
else
{
length++;
}
}
for(i=length;i>0;i--)
{
printf("%c",c[i-1]);
}
printf("\n");
}
这段代码中的数组,声明大了浪费内存空间,声明小了又怕不够,所以写这种代码的人一般写完之后会祈祷,祈祷测试的人不要输入的太多,太多就不能完全显示了!
与其这么提心吊胆,于是又有人想出了第二种方法,终于解决了一些问题,而且完全实现了程序的实际要求,于是,这种人经过一番苦想,觉得问题终于可以解决了,这种方法看起来是一种很不错的方法 。
猜你喜欢
- 日本所处的半球位置,纬度位置和海陆位置有何特点
- 小满养生有何误区
- 什么是相对静止?承认相对静止来自有何意义
- 向量的计算法则
- 山药蛋派、荷花淀派、茶子花派各有何主要特点?
- SMC材料有何优点?
- 柯尔鸭是什么品种 与其它鸭子有何区别
- 共进晚餐是什么意思 共进晚餐有何意思
- 关于曾经拥有的句子
- 什么是经络学?包括哪些内容?在中医养生学有何作用?
