用特殊字符“*”替换序列中的每个第二个值

用特殊字符“*”替换序列中的每个第二个值

让我们将用户的输入视为9。所以斐波那契数列直到 9 如下 0,1,1,2,3,5,8,13,21

预期输出: 0,*,1,*,3,*,8,*,21

下面是我用来实现逻辑的代码

UserInput=9 
a=0 
b=1 

echo "The Fibonacci series is  : "

for (( i=0; i<UserInput; i++ )) 
do
    if [ $i -eq 2 ]
    then 
        echo -n "$a "
        sn=$((a + b)) 
        a=$b 
        b=$sn 
    fi 
done

答案1

基于强制awk的解决方案(为简单起见,我假设n>2):

awk -v n=9 'BEGIN{q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'

用户输入存储在变量中并通过命令行参数n传递。awk-v n=number

为了立即退出,如果n<3

awk -v n=9 'BEGIN{if (n<3) exit; q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'

解释

awk是一个文本处理工具,我们正在“创造性地滥用”它。因此,一切都发生在BEGIN块内,该块通常包含在处理第一个输入文件之前执行的代码。

语法本身非常像 C,所以我们

  • 打印该级数的前两项(由于我们假设 ,所以它们是固定的n>2):printf "0,*,"
  • 从 循环2n-1并计算斐波那契数s作为前两个 和 的总和qr并更新qr
  • *如果是偶数,则打印;如果不是偶数,i则打印当前的斐波那契数( )si%2?"*":s
  • 然后打印 a,或换行符,具体取决于我们是否到达循环末尾 ( i==n-1)。

答案2

使用 Bash 和算术运算符最接近您的代码是:

#!/bin/bash
let UserInput=9 
let a=0 
let b=1
echo -n "The Fibonacci series is: 0"
for (( i=1; i<UserInput; i++ )) ; do
  let sn=a+b
  let a=b
  let b=sn
  if (( i % 2 == 0 )) ; then 
    echo -n ",$a"
  else
    echo -n ",*"
  fi 
done
echo

if语句中,您必须使用%模(余数)运算符。使用它你可以测试是否i能被二整除(即偶数)并相应地打印 的值$a或打印 a *

输出将是:

The Fibonacci series is: 0,*,1,*,3,*,8,*,21

更改脚本,以便它从其自身获取步骤数争论,请修改脚本的第一行,如下所示:

let UserInput="$1"

相关内容